Как я могу получить объект сеанса, если у меня есть entitymanager

У меня

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

    return detachedCriteria.getExecutableCriteria( ??? ).list();
}

Как я могу получить сеанс, если я использую entitymanager, или как я могу получить результат из моего detachedcriteria?

Ответ 1

Чтобы быть полностью исчерпывающим, все по-другому, если вы используете JPA 1.0 или JPA 2.0.

JPA 1.0

С JPA 1.0 вам нужно будет использовать EntityManager#getDelegate(). Но имейте в виду, что результат этого метода специфичен для реализации, т.е. Не переносится с сервера приложений с использованием Hibernate на другой. Например с JBoss вы бы сделали:

org.hibernate.Session session = (Session) manager.getDelegate();

Но с GlassFish, вам нужно будет:

org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession(); 

Я согласен, что это ужасно, и здесь виноват spec (недостаточно ясно).

JPA 2.0

С JPA 2.0 существует новый (и намного лучший) EntityManager#unwrap(Class<T>) метод, который должен быть предпочтительнее EntityManager#getDelegate() для новых приложений.

Итак, с Hibernate в качестве реализации JPA 2.0 (см. 3.15. Native Hibernate API):

Session session = entityManager.unwrap(Session.class);

Ответ 2

См. раздел " 5.1. Доступ к API-интерфейсам Hibernate из JPA" в Hibernate ORM User Guide:

Session session = entityManager.unwrap(Session.class);

Ответ 3

Это будет объясняться лучше.

EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);

Ответ 4

Я работал в Wildfly, но я использовал

org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();

и правильный был

org.hibernate.Session session = (Session) manager.getDelegate();