Я хотел бы использовать 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 я вижу, что
при переходе в спящий режимEntityManagerFactory создается, он будет искать канонический класс метамодели для каждого из управляемых типизированных, о которых он знает, и, если он найдет их, он вставит в них соответствующую информацию метамодели, как описано в [Спецификация JPA 2, раздел 6.2.2,pg 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 и ее класс метамодели .
Что еще можно сказать о моей конфигурации ...
Я использую Hibernat 3.5.6-Final (согласно META-INF / MANIFEST.MF),
развернуть на Glassfish 3.0.1
из Netbeans 6.9.1 ;
и приложение использует EJB 3.1 ,
Надеюсь, это поможет!
EDIT 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)
Доступен гораздо более простой проект здесь / tarball . Он содержит только мои сущности и их метамодель, плюс тест JUnit (foo падает с метамоделью, bar в порядке с обычным Query.
EDIT5:
Вы сможете воспроизвести проблему, загрузив 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)
Все используемые мной спящие зависимости должны быть включены в архив.