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

107

у меня есть

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

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

storm_buster
источник
См. Также((EntityManagerImpl)em).getSession();
ashley

Ответы:

181

Чтобы быть полностью исчерпывающим, все будет иначе, если вы используете реализацию 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(); 

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

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);
Паскаль Тивент
источник
1
entityManager.unwrap(Session.class);что Sessionвнутри Session.class? это импорт?
Thang Pham
Зависит от реализации JPA, если вы используете eclipselink, этоorg.eclipse.persistence.sessions.Session
albciff
41

См. Раздел « 5.1. Доступ к API Hibernate из JPA » в Руководстве пользователя Hibernate ORM :

Session session = entityManager.unwrap(Session.class);
Владимир Иванов
источник
entityManager.unwrap(Session.class);что Sessionвнутри Session.class? это импорт?
Thang Pham
2
Руководство Hibernate изменилось. Пункт 15.8 больше не дает никакой информации о получении сеанса.
Nicktar
1
По состоянию на январь 2019 года в руководстве по Hibernate (5.3.7), §5.1, по-прежнему указывается, что это способ получения ссылки на объект Session.
Alain BECKER
5

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

EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);
Энио Дантас
источник
0

entityManager.unwrap (Session.class) используется для получения сеанса от EntityManager.

@Repository
@Transactional
public class EmployeeRepository {

  @PersistenceContext
  private EntityManager entityManager;

  public Session getSession() {
    Session session = entityManager.unwrap(Session.class);
    return session;
  }

  ......
  ......

}

Ссылка на демонстрационное приложение .

Хари Кришна
источник
-1

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

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

и правильным было

org.hibernate.Session session = (Session) manager.getDelegate();
Карлос Вейнтемилла
источник