我想将 JPA2 Criteria API 与元模型对象一起使用,这似乎很容易:
...
Root<JPAAlbum> albm = cq.from(JPAAlbum.class);
... albm.get(JPAAlbum_.theme) ... ;
但是这个 Root.get 总是抛出一个NullPointerException
. JPAAlbum_.theme
由 Hibernate 自动生成,看起来像
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
)和相关的堆栈跟踪:
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+"_+_") ;
仍然绝望地空着......
EDIT3:这里是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 与元模型崩溃,bar 与通常的 Query.
编辑 5:
您应该能够通过下载tarball并构建项目来重现该问题:
ant compile
or
ant dist
并开始 JUnit 测试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 的正确位置)
我使用的所有休眠依赖项都应该包含在存档中。