在EclipseLink中生成的静态元模型类存在问题。在我的项目中,我首先使用以下方法为我的实体生成静态元模型:
1) org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor和IntelliJ IDEA和这个类已经生成到:target/generated-sources
然后,我尝试使用此类Hibernate生成的元模型类(例如。),但是包含对元模型属性的引用的代码行会引发NullPointerException异常:
SingularAttribute<Employee, String> descriptionAttr = Employee_.description;
predicates.add(criteriaBuilder.like(employee.get(descriptionAttr), "%" + description + "%"));这里,emploee.get( >> null << )抛出异常。
@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.CanonicalModelProcessor和target/generated-sources-eclipselink (如在图片上)与EclipseLink类似地生成了它们。

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

3)我还在build.gradle中使用我认为包括在项目中生成的这些源的配置:
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
<property name="eclipselink.canonicalmodel.subpackage" value="metamodel" />以及第二个持久性单元的此类属性(以避免重复冲突)
<property name="eclipselink.canonicalmodel.subpackage" value="metamodel_local" />但我不想用这代人。它在子包中,在我的代码中,我只导入以前生成的元模型类。原因是我希望在Hibernate/Eclipse生成的同一个名称空间元模型类中适当地使用它们。但是,如果Hibernate生成的元模型类也可以使用EclipseLink,那么只使用一代就不会有问题。
6)此外,我不能使用由persistence.xml属性生成的元模型类,因为每次运行/构建项目时都会重新生成它们。我需要在代码中手动修改两个元模型类,因为它们是从单个抽象元模型类继承的。这里,我在元模型类的AbstractType和ConcreteType的子类中重写SetAttribute。
7)最后,我粘贴了在使用这种元模型类配置运行集成测试时遇到的错误
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发布于 2015-09-17 12:48:22
-我正在检查EclipseLink的消息来源:
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,那就太好了。请复制粘贴这个描述,并提供一些测试用例(这个元模型的示例应用程序),让我们复制它并开发一些修复。
发布于 2019-08-09 07:48:13
问题可能在初始化失败的规范元模型中。您可以查看您的eclipselink日志,以检查类似的内容:
Could not load the field named [...] on the class [...]
IllegalArgumentException: Can not set static ... field ... to ...在我的例子中,在修复初始化之后,NPE已经消失了。
发布于 2017-07-06 08:21:39
我知道这是一张旧票,但我还是想让你们知道我们是如何解决问题的。特别是最后一个空指针异常。
问题是,当您第一次使用Criteriabuilder时,您的实体管理器没有加载。要解决这个问题,可以在persistence.xml中设置以下内容
<property name="eclipselink.deploy-on-startup" value="true" />https://stackoverflow.com/questions/32328333
复制相似问题