Как я могу получить объект сеанса, если у меня есть Entitymanager
-
30-09-2019 - |
Вопрос
у меня есть
private EntityManager em;
public List getAll(DetachedCriteria detachedCriteria) {
return detachedCriteria.getExecutableCriteria( ??? ).list();
}
Как я могу получить сеанс, если я использую EntityManager или как я могу получить результат от моих детехэкритерии?
Решение
Чтобы быть полностью исчерпывающим, все отличаются, если вы используете 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()
Для новых приложений.
Так что с гибернатом как реализация JPA 2.0 (см. 3.15. Родная гибернация API.), вы сделаете:
Session session = entityManager.unwrap(Session.class);
Другие советы
Смотрите раздел "5.1. Доступ к Hibernate API от JPA" в Руководство пользователя Hibernate ORM:
Session session = entityManager.unwrap(Session.class);
Это объяснит лучше.
EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);
Я работал в светофор, но я использовал
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
и правильно было
org.hibernate.Session session = (Session) manager.getDelegate();