Не заполнены атрибуты статической метамодели JPA / Hibernate - NullPointerException
Я хотел бы использовать 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 сущность И егокласс метамодели.
Что еще я могу рассказать о своей конфигурации ...
Я использую Hibernat3.5.6-Final (согласно META-INF / MANIFEST.MF),
развернуть на Glassfish3.0.1
из Netbeans6.9.1;
и приложение опирается на EJB3,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)
Доступен гораздо более простой проектВот/тарболом. Он содержит только мои сущности и их метамодель, плюс тест JUnit (foo падает с метамоделью, bar в порядке с обычным Query.
РЕДАКТИРОВАТЬ 5:
Вы должны быть в состоянии воспроизвести проблему, загрузивтарболомСтроим проект:
ant compile
or
ant dist
и запустить тест JUnitnet.wazari.dao.test.TestMetaModel
CLASSPATH=`sh runTest.sh` java org.junit.runner.JUnitCore net.wazari.dao.test.TestMetaModel
(редактироватьrunTest.sh
чтобы указать CLASSPATH на правильное место вашей банки JUnit4-5)
Все используемые мной спящие зависимости должны быть включены в архив.