Як я можу отримати об’єкт сеансу, якщо у мене є суб'єкт-менеджер


107

У мене є

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

Як я можу отримати сеанс, якщо використовую entitmanager або як я можу отримати результат за своїми окремими критеріями?


Дивіться також((EntityManagerImpl)em).getSession();
ашли

Відповіді:


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? це імпорт?
Тханг Фам

Залежить від реалізації програми JPA, якщо ви використовуєте eclipselink, цеorg.eclipse.persistence.sessions.Session
albciff

41

Дивіться розділ " 5.1. Доступ до Hibernate API від JPA " в Посібнику користувача Hibernate ORM :

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

entityManager.unwrap(Session.class);що Sessionв Session.class? це імпорт?
Тханг Фам

2
Змінено посібник зі сну. Пункт 15.8 більше не дає інформації про отримання сеансу.
Ніккер

1
Станом на січень 2019 року в поточному посібнику зі сплячого режиму (5.3.7), пункт 5.1, все ще зазначено це як спосіб отримання посилання на об’єкт сесії.
Ален

5

Це пояснить краще.

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

0

'entitManager.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.