我想将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
之前)和关联的stacktrace: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指南中,我可以看到
我也可以用
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 entity及其metamodel class。
关于配置我还能说些什么...
希望对您有所帮助!
编辑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)
可以使用here / 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的正确位置)我使用的所有休眠依赖关系都应包含在存档中。
最佳答案
我有同样的问题,可以通过将Model
和Model_
类放入同一包中来解决。