我想将JPA2 Criteria API与元模型对象一起使用,这看起来很简单:
...
Root<JPAAlbum> albm = cq.from(JPAAlbum.class);
... albm.get(JPAAlbum_.theme) ... ;
Run Code Online (Sandbox Code Playgroud)
但是这个Root.get总是抛出一个NullPointerException.JPAAlbum_.theme是由Hibernate自动生成的,看起来像
public static volatile SingularAttribute<JPAAlbum, JPATheme> theme;
Run Code Online (Sandbox Code Playgroud)
但它显然从未填充过.
我错过了框架初始化的一个步骤吗?
编辑:这是我在崩溃时如何使用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())) ;
Run Code Online (Sandbox Code Playgroud)
(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)
Run Code Online (Sandbox Code Playgroud)
编辑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()) ;
} …Run Code Online (Sandbox Code Playgroud)