Atributos de metamodelo estático JPA / Hibernate no poblados - NullPointerException
Me gustaría usar la API de criterios JPA2 con objetos de metamodelo, lo que parece ser bastante fácil:
...
Root<JPAAlbum> albm = cq.from(JPAAlbum.class);
... albm.get(JPAAlbum_.theme) ... ;
pero este Root.get siempre arroja unNullPointerException
. JPAAlbum_.theme
fue generado automáticamente por Hibernate y parece
public static volatile SingularAttribute<JPAAlbum, JPATheme> theme;
pero obviamente nunca está poblado.
¿Me estoy perdiendo un paso en la inicialización del marco?
EDITAR: Aquí hay un fragmento de cómo uso JPA y el metamodelo cuando falla:
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_
es una clase, así que soloimport
antes) y el stacktrace asociado:
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)
EDITAR 2:
En la guía JBoss EntityManager, puedo ver que
Cuando se construye la Hibernate EntityManagerFactory, buscará una clase de metamodelo canónico para cada uno de los tipos gestionados que conoce y, si encuentra alguno, inyectará la información de metamodelo adecuada en ellos, como se describe en [Especificación JPA 2, sección 6.2 .2, pág. 200]
También podría verificar con
for (ManagedType o : em.getMetamodel().getManagedTypes()) {
log.warn("___") ;
for (Object p : o.getAttributes()) {
log.warn(((Attribute)p).getName()) ;
}
}
que Hibernate conoce mi metamodelo, los nombres de los atributos están escritos, sin embargo
log.warn("_+_"+JPAPhoto_.id+"_+_") ;
permanece desesperadamente vacío ...
EDITAR3: aquí está elJPAAlbum entidad y esclase metamodelo.
¿Qué más puedo decir sobre mi configuración ...
Yo uso hibernat3.5.6-Final (según META-INF / MANIFEST.MF),
desplegar en Glassfish3.0.1
de Netbeans6.9.1;
y la aplicación se basa en EJB3.1,
¡Espero que ayude!
EDITAR 4:
desafortunadamente, la prueba JUnit conduce a la misma excepción:
java.lang.NullPointerException
at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:138)
at net.wazari.dao.test.TestMetaModel.foo(TestMetaModel.java:55)
Un proyecto mucho más simple está disponibleaquí/tarball. Solo contiene mis entidades y su metamodelo, además de una prueba JUnit (si falla con el metamodelo, la barra está bien con la consulta habitual.
EDITAR 5:
Debería poder reproducir el problema descargando eltarball, construyendo el proyecto:
ant compile
or
ant dist
e inicie la prueba JUnitnet.wazari.dao.test.TestMetaModel
CLASSPATH=`sh runTest.sh` java org.junit.runner.JUnitCore net.wazari.dao.test.TestMetaModel
(editarrunTest.sh
para apuntar CLASSPATH a la ubicación correcta de su jar JUnit4-5)
Todas las dependencias de hibernación que uso deben incluirse en el archivo.