Jak mogę uzyskać obiekt sesji, jeśli mam menedżera encji

107

mam

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

Jak mogę pobrać sesję, jeśli korzystam z uprawnionego menedżera lub jak mogę uzyskać wynik z moich odłączonych kryteriów?

Storm_buster
źródło
Zobacz także((EntityManagerImpl)em).getSession();
ashley

Odpowiedzi:

181

Aby być całkowicie wyczerpującym, sytuacja wygląda inaczej, jeśli używasz implementacji JPA 1.0 lub JPA 2.0.

JPA 1.0

W przypadku JPA 1.0 musiałbyś użyć EntityManager#getDelegate(). Należy jednak pamiętać, że wynik tej metody jest specyficzny dla implementacji, tj. Nieprzenośny z serwera aplikacji za pomocą Hibernacji do drugiego. Na przykład z JBossem zrobiłbyś:

org.hibernate.Session session = (Session) manager.getDelegate();

Ale w przypadku GlassFish musisz zrobić:

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

Zgadzam się, to okropne, a specyfika jest tutaj winna (nie dość jasne).

JPA 2.0

W przypadku JPA 2.0 istnieje nowa (i znacznie lepsza) EntityManager#unwrap(Class<T>)metoda, którą należy preferować w EntityManager#getDelegate()przypadku nowych aplikacji.

Tak więc z Hibernate jako implementacją JPA 2.0 (patrz 3.15. Native Hibernate API ), powinieneś:

Session session = entityManager.unwrap(Session.class);
Pascal Thivent
źródło
1
entityManager.unwrap(Session.class);co jest Sessionw Session.classśrodku czy to jest import?
Thang Pham
Zależy od implementacji JPA, jeśli używasz eclipselink, jest toorg.eclipse.persistence.sessions.Session
albciff
41

Zobacz sekcję „ 5.1. Dostęp do interfejsów API Hibernate z JPA ” w Podręczniku użytkownika Hibernate ORM :

Session session = entityManager.unwrap(Session.class);
Vladimir Ivanov
źródło
entityManager.unwrap(Session.class);co jest Sessionw Session.classśrodku czy to jest import?
Thang Pham
2
Podręcznik hibernacji został zmieniony. Punkt 15.8 nie zawiera już żadnych informacji o uzyskaniu sesji.
Nicktar
1
Od stycznia 2019 r. W podręczniku Hibernate current (5.3.7), §5.1, nadal podaje się, że jest to sposób na uzyskanie odniesienia do obiektu Session.
Alain BECKER
5

To lepiej wyjaśni.

EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);
Enio Dantas
źródło
0

„entityManager.unwrap (Session.class)” jest używany do pobierania sesji z EntityManager.

@Repository
@Transactional
public class EmployeeRepository {

  @PersistenceContext
  private EntityManager entityManager;

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

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

}

Link do aplikacji demonstracyjnej .

Hari Krishna
źródło
-1

Pracowałem w Wildfly, ale korzystałem

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

a poprawna była

org.hibernate.Session session = (Session) manager.getDelegate();
carlos veintemilla
źródło