Я хотел бы использовать API-интерфейс JPA2 с объектами метамодели, что кажется довольно простым:
...
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 и метамодель.
Что еще я могу рассказать о моей конфигурации...
-
Я использую Hibernat 3.5.6-Final (согласно META-INF/MANIFEST.MF),
-
развертывание на Glassfish 3.0.1
-
от Netbeans 6.9.1;
-
и приложение полагается на EJB 3.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)
Доступен гораздо более простой проект здесь/tarball. Он содержит только мои сущности и их метамодель плюс тест JUnit (сбой foo с метамоделью, bar в порядке с обычным Query.
РЕДАКТИРОВАТЬ 5:
Вы должны иметь возможность воспроизвести проблему, загрузив 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)
Все связанные с гибернацией зависимости должны быть включены в архив.