Не заполнены атрибуты статической метамодели 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)

Все используемые мной спящие зависимости должны быть включены в архив.

Ответы на вопрос(7)

Ваш ответ на вопрос