Atributos de metamodelo estático de JPA / hibernação não preenchidos - NullPointerException
Gostaria de usar a API JPA2 Criteria com objetos de metamodelo, o que parece ser bastante fácil:
...
Root<JPAAlbum> albm = cq.from(JPAAlbum.class);
... albm.get(JPAAlbum_.theme) ... ;
mas este Root.get sempre lança umNullPointerException
. JPAAlbum_.theme
foi gerado automaticamente pelo Hibernate e parece
public static volatile SingularAttribute<JPAAlbum, JPATheme> theme;
mas obviamente nunca é preenchido.
Estou perdendo uma etapa na inicialização da estrutura?
EDITAR: Aqui está um trecho de como eu uso o JPA e o metamodelo quando está travando:
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_
é uma aula, então eu sóimport
antes) e o rastreamento de pilha associado:
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)
EDIT 2:
No guia do JBoss EntityManager, posso ver que
Quando o Hibernate EntityManagerFactory estiver sendo construído, ele procurará uma classe de metamodelo canônico para cada um dos tipos digitados gerenciados conhecidos e, se encontrar algum, injetará neles as informações de metamodelo apropriadas, conforme descrito em [Especificação JPA 2, seção 6.2. .2, página 200]
Eu também pude verificar com
for (ManagedType o : em.getMetamodel().getManagedTypes()) {
log.warn("___") ;
for (Object p : o.getAttributes()) {
log.warn(((Attribute)p).getName()) ;
}
}
que o Hibernate está ciente do meu metamodelo, os nomes dos atributos são escritos, no entanto
log.warn("_+_"+JPAPhoto_.id+"_+_") ;
permanece desesperadamente vazio ...
EDIT3: aqui está oEntidade JPAAlbum e os seusclasse metamodelo.
O que mais posso dizer sobre minha configuração ...
Eu uso o hibernat3.5.6-Final (de acordo com META-INF / MANIFEST.MF),
implantar no Glassfish3.0.1
do Netbeans6.9.1;
e o aplicativo depende do EJB3.1.,
Eu espero que isso ajude !
EDIT 4:
infelizmente, o teste JUnit leva à mesma exceção:
java.lang.NullPointerException
at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:138)
at net.wazari.dao.test.TestMetaModel.foo(TestMetaModel.java:55)
Um projeto muito mais simples está disponívelaqui/tarball. Ele contém apenas minhas entidades e seu metamodelo, além de um teste JUnit (foo trava com o metamodelo, bar está bem com a consulta usual.
EDIT 5:
Você deve conseguir reproduzir o problema baixando otarball, construindo o projeto:
ant compile
or
ant dist
e inicie o teste JUnitnet.wazari.dao.test.TestMetaModel
CLASSPATH=`sh runTest.sh` java org.junit.runner.JUnitCore net.wazari.dao.test.TestMetaModel
(editarrunTest.sh
para apontar CLASSPATH para o local correto do seu jar JUnit4-5)
Todas as dependências de hibernação que eu uso devem ser incluídas no arquivo morto.