Доступ к сеансу Hibernate из EJB с помощью EntityManager
Возможно ли получить объект сеанса Hibernate из EntityManager? Я хочу получить доступ к некоторому API-интерфейсу hibernate...
Я уже пробовал что-то вроде:
org.hibernate.Session hSession =
( (EntityManagerImpl) em.getDelegate() ).getSession();
но как только я вызываю метод в EJB, я получаю "Исключение системы во время вызова в EJB" с NullPointerException
Я использую glassfish 3.0.1
Ответы
Ответ 1
Bozho и partenon верны, но:
В JPA 2 предпочтительным механизмом является entityManager.unwrap(класс)
HibernateEntityManager hem = em.unwrap(HibernateEntityManager.class);
Session session = hem.getSession();
Я думаю, что ваше исключение вызвано тем, что вы пытаетесь применить к классу реализации (возможно, вы имели дело с прокси-сервером JDK). Передача в интерфейс, и все должно быть хорошо (в версии JPA 2 не требуется кастинг).
Ответ 2
Из документов Hibernate EntityManager предпочтительный способ сделать это:
Session session = entityManager.unwrap(Session.class);
Ответ 3
Проще, чем:
Session session = (Session) em.getDelegate();
Ответ 4
Если ваш EntityManager
правильно введен (с использованием @PersistenceContext
) и не является нулевым, то должно работать следующее:
org.hibernate.Session hSession = (Session) em.getDelegate();