Я хотел бы использовать API критериев JPA2 с объектами метамодели, что кажется довольно простым:
...
Root albm = cq.from(JPAAlbum.class);
... albm.get(JPAAlbum_.theme) ... ;
но этот Root.get всегда выдает исключение NullPointerException
. JPAAlbum_.theme
был автоматически сгенерирован Hibernate и выглядит как
public static volatile SingularAttribute theme;
, но, очевидно, никогда не заполнялся.
Я пропустил этап инициализации фреймворка?
EDIT: здесь это фрагмент того, как я использую JPA и метамодель при сбое:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(JPAAlbum.class) ;
Root albm = cq.from(JPAAlbum.class);
cq.where(cb.equal(albm.get(JPAAlbum_.theme).get(JPATheme_.id),
session.getTheme().getId())) ;
( JPAAlbum_
- это класс, поэтому я просто импортирую
раньше) и связанную трассировку стека:
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 работает с обычным запросом.
РЕДАКТИРОВАТЬ 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 jar)
Все используемые мной зависимости гибернации должны быть включены в архив.