Как я могу получить объект сеанса, если у меня есть менеджер сущностей - PullRequest
98 голосов
/ 10 ноября 2010

у меня

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

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

Ответы [ 3 ]

167 голосов
/ 11 ноября 2010

Чтобы быть полностью исчерпывающим, все будет иначе, если вы используете реализацию 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 as JPA 2.0 (см. 3.15. Собственный API Hibernate ), вы должны сделать:

Session session = entityManager.unwrap(Session.class);
36 голосов
/ 10 ноября 2010

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

Session session = entityManager.unwrap(Session.class);
4 голосов
/ 24 марта 2016

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

EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...