我想将JPA2 Criteria API与元模型对象一起使用,这似乎很简单:
... Root<JPAAlbum> albm = cq.from(JPAAlbum.class); ... albm.get(JPAAlbum_.theme) ... ;
但是这个Root.get总是抛出一个NullPointerException。JPAAlbum_.theme是由Hibernate自动生成的,看起来像
NullPointerException
JPAAlbum_.theme
public static volatile SingularAttribute<JPAAlbum, JPATheme> theme;
但显然从未有人居住。
我是否缺少框架初始化步骤?
编辑: 这是崩溃时我如何使用JPA和元模型的摘要:
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<JPAAlbum> cq = cb.createQuery(JPAAlbum.class) ; Root<JPAAlbum> albm = cq.from(JPAAlbum.class); cq.where(cb.equal(albm.get(JPAAlbum_.theme).get(JPATheme_.id), session.getTheme().getId())) ;
(JPAAlbum_是一个类,所以我就import在前面)和相关的堆栈跟踪:
JPAAlbum_
import
Caused by: java.lang.NullPointerException at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:138) at net.wazari.dao.jpa.WebAlbumsDAOBean.getRestrictionToAlbumsAllowed(WebAlbumsDAOBean.java:55)
编辑2:
在JBoss EntityManager指南中,我可以看到
当构建Hibernate EntityManagerFactory时,它将为每个已知的托管类型寻找规范的元模型类,如果发现任何托管类型,它将向其中注入适当的元模型信息,如[JPA 2规范,第6.2节中所述] .2,第200页]
我也可以用
for (ManagedType o : em.getMetamodel().getManagedTypes()) { log.warn("___") ; for (Object p : o.getAttributes()) { log.warn(((Attribute)p).getName()) ; } }
Hibernate知道我的元模型,但是写了属性名称
log.warn("_+_"+JPAPhoto_.id+"_+_") ;
仍然拼命空着…
编辑3 :这是JPAAlbum实体及其元模型类。
关于配置我还能说些什么…
我使用的是Hibernat 3.5.6-Final (根据META-INF / MANIFEST.MF),
在Glassfish 3.0.1 上部署 __
来自Netbeans 6.9.1 ;
并且该应用程序依赖于EJB 3.1 ,
希望对您有所帮助!
编辑4:
不幸的是,JUnit测试导致相同的异常:
java.lang.NullPointerException at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:138) at net.wazari.dao.test.TestMetaModel.foo(TestMetaModel.java:55)
/ tarball提供了一个更简单的项目。它只包含我的实体及其元模型,外加一个JUnit测试(元模型的foo崩溃,通常的Query都可以吧。
编辑5:
您应该能够通过下载tarball,构建项目来重现该问题:
ant compile or ant dist
并开始JUnit测试 net.wazari.dao.test.TestMetaModel
net.wazari.dao.test.TestMetaModel
CLASSPATH=`sh runTest.sh` java org.junit.runner.JUnitCore net.wazari.dao.test.TestMetaModel
(编辑runTest.sh以将CLASSPATH指向JUnit4-5 jar的正确位置)
runTest.sh
我使用的所有hibernate依赖关系都应包含在存档中。
我有同样的问题,可以通过将Modeland Model_类放入同一包中来解决。
Model
Model_