首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EclipseLink中的JPA静态元模型类在访问属性时抛出NullPointerException

EclipseLink中的JPA静态元模型类在访问属性时抛出NullPointerException
EN

Stack Overflow用户
提问于 2015-09-01 09:42:38
回答 3查看 2.5K关注 0票数 3

在EclipseLink中生成的静态元模型类存在问题。在我的项目中,我首先使用以下方法为我的实体生成静态元模型:

1) org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor和IntelliJ IDEA和这个类已经生成到:target/generated-sources

然后,我尝试使用此类Hibernate生成的元模型类(例如。),但是包含对元模型属性的引用的代码行会引发NullPointerException异常:

代码语言:javascript
复制
 SingularAttribute<Employee, String> descriptionAttr = Employee_.description;
 predicates.add(criteriaBuilder.like(employee.get(descriptionAttr), "%" + description + "%"));

这里,emploee.get( >> null << )抛出异常。

代码语言:javascript
复制
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(Employee.class)
public abstract class Employee_ extends pl.salonea.entities.NaturalPerson_ {

    public static volatile SetAttribute<Employee, Skill> skills;
    public static volatile SetAttribute<Employee, ProviderService> suppliedServices;
    public static volatile SetAttribute<Employee, EmployeeRating> receivedRatings;
    public static volatile SingularAttribute<Employee, String> description;
    public static volatile SetAttribute<Employee, Education> educations;
    public static volatile SingularAttribute<Employee, String> jobPosition;
    public static volatile SetAttribute<Employee, TermEmployeeWorkOn> termsOnWorkStation;

}

2)接下来,我认为这个元模型类可能是特定于实现的。因此,我使用org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessortarget/generated-sources-eclipselink (如在图片上)与EclipseLink类似地生成了它们。

最后,我有一个类似于带有元模型的目录结构:

3)我还在build.gradle中使用我认为包括在项目中生成的这些源的配置:

代码语言:javascript
复制
if(hasProperty('jboss')) {
    sourceSets {
        main {
            java {
                srcDir 'target/generated-sources/'
            }
        }
    }
} else {
    sourceSets {
        main {
            java {
                srcDir 'target/generated-sources-eclipselink/'
            }
        }
    }
}

这样,我想用Jboss使用Hibernate生成的类,用EclipseLink使用EclipseLink生成类。

4)只有在运行在WilfFly/Hibernate上而不是在GlassFish/EclipseLink上运行的情况下,这种配置才能工作--这里是NullPointerException

5)在persistence.xml中,我使用这样的属性为一个持久性单元生成了更多的EclipseLink

代码语言:javascript
复制
<property name="eclipselink.canonicalmodel.subpackage" value="metamodel" />

以及第二个持久性单元的此类属性(以避免重复冲突)

代码语言:javascript
复制
<property name="eclipselink.canonicalmodel.subpackage" value="metamodel_local" />

但我不想用这代人。它在子包中,在我的代码中,我只导入以前生成的元模型类。原因是我希望在Hibernate/Eclipse生成的同一个名称空间元模型类中适当地使用它们。但是,如果Hibernate生成的元模型类也可以使用EclipseLink,那么只使用一代就不会有问题。

6)此外,我不能使用由persistence.xml属性生成的元模型类,因为每次运行/构建项目时都会重新生成它们。我需要在代码中手动修改两个元模型类,因为它们是从单个抽象元模型类继承的。这里,我在元模型类的AbstractType和ConcreteType的子类中重写SetAttribute。

7)最后,我粘贴了在使用这种元模型类配置运行集成测试时遇到的错误

代码语言:javascript
复制
 Caused by: java.lang.NullPointerException
    at org.eclipse.persistence.internal.jpa.querydef.FromImpl.get(FromImpl.java:263)
    at pl.salonea.ejb.stateless.EmployeeFacade.findByMultipleCriteria(EmployeeFacade.java:295)
    at pl.salonea.ejb.stateless.EmployeeFacade.findByMultipleCriteria(EmployeeFacade.java:269)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081)
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153)
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4786)
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:656)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608)
    at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:46)
    at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:52)
    at sun.reflect.GeneratedMethodAccessor113.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140)
    at sun.reflect.GeneratedMethodAccessor141.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369)
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4758)
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4746)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212)
    ... 149 more
EN

回答 3

Stack Overflow用户

发布于 2015-09-17 12:48:22

-我正在检查EclipseLink的消息来源:

代码语言:javascript
复制
public <Y> Path<Y> get(SingularAttribute<? super X, Y> att){
    if (att.getPersistentAttributeType().equals(
            PersistentAttributeType.BASIC)) {
        return new PathImpl<Y>(
                this, this.metamodel, att.getBindableJavaType(),
                this.currentNode.get(att.getName()), att);
    } else {
        Class<Y> clazz = att.getBindableJavaType();
        Join join = new JoinImpl<X, Y>(
                this, this.metamodel.managedType(clazz),
                this.metamodel, clazz,
                this.currentNode.get(att.getName()), att);
        this.joins.add(join);
        return join;
    }
}

FromImpl.java:263是if语句的条件,所以看起来att.getPersistentAttributeType()返回null

如果您能够在EclipseLink组件JPA上针对bug.cgi?product=EclipseLink提交一个bug,那就太好了。请复制粘贴这个描述,并提供一些测试用例(这个元模型的示例应用程序),让我们复制它并开发一些修复。

票数 2
EN

Stack Overflow用户

发布于 2019-08-09 07:48:13

问题可能在初始化失败的规范元模型中。您可以查看您的eclipselink日志,以检查类似的内容:

代码语言:javascript
复制
Could not load the field named [...] on the class [...]
IllegalArgumentException: Can not set static ... field ... to ...

在我的例子中,在修复初始化之后,NPE已经消失了。

票数 0
EN

Stack Overflow用户

发布于 2017-07-06 08:21:39

我知道这是一张旧票,但我还是想让你们知道我们是如何解决问题的。特别是最后一个空指针异常。

问题是,当您第一次使用Criteriabuilder时,您的实体管理器没有加载。要解决这个问题,可以在persistence.xml中设置以下内容

代码语言:javascript
复制
<property name="eclipselink.deploy-on-startup" value="true" />
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32328333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档