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


107

у меня есть

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

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


См. Также((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();
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.