Como posso obter o objeto de sessão se eu tiver o gerenciador de entidades

107

eu tenho

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

Como posso recuperar a sessão se estou usando o entitymanager ou como posso obter o resultado de meus critérios separados?

storm_buster
fonte
Veja também((EntityManagerImpl)em).getSession();
ashley

Respostas:

181

Para ser totalmente exaustivo, as coisas são diferentes se você estiver usando uma implementação JPA 1.0 ou JPA 2.0.

JPA 1.0

Com JPA 1.0, você teria que usar EntityManager#getDelegate(). Mas tenha em mente que o resultado desse método é específico da implementação, ou seja, não é portátil de um servidor de aplicação usando Hibernate para outro. Por exemplo, com o JBoss você faria:

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

Mas com GlassFish , você teria que fazer:

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

Eu concordo, isso é horrível, e a especificação é a culpada aqui (não é clara o suficiente).

JPA 2.0

Com o JPA 2.0, há um EntityManager#unwrap(Class<T>)método novo (e muito melhor) que deve ser preferido EntityManager#getDelegate()para novos aplicativos.

Portanto, com o Hibernate como implementação JPA 2.0 (consulte 3.15. API Nativa do Hibernate ), você faria:

Session session = entityManager.unwrap(Session.class);
Pascal Thivent
fonte
1
entityManager.unwrap(Session.class);o que está Sessiondentro Session.class? é uma importação?
Thang Pham
Depende da implementação de JPA, se você estiver usando eclipselink éorg.eclipse.persistence.sessions.Session
albciff
41

Veja a seção " 5.1. Acessando Hibernate APIs de JPA " no Hibernate ORM User Guide :

Session session = entityManager.unwrap(Session.class);
Vladimir Ivanov
fonte
entityManager.unwrap(Session.class);o que está Sessiondentro Session.class? é uma importação?
Thang Pham
2
O Manual de Hibernação mudou. O ponto 15.8 já não dá qualquer informação sobre a obtenção de uma sessão.
Nicktar
1
Em janeiro de 2019, o manual atual do Hibernate (5.3.7), §5.1, ainda afirma isso como a forma de obter uma referência para um objeto de Sessão.
Alain BECKER
5

Isso vai explicar melhor.

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

'entityManager.unwrap (Session.class)' é usado para obter a sessão do EntityManager.

@Repository
@Transactional
public class EmployeeRepository {

  @PersistenceContext
  private EntityManager entityManager;

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

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

}

Link do aplicativo de demonstração .

Hari Krishna
fonte
-1

Eu estava trabalhando no Wildfly, mas estava usando

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

e o correto era

org.hibernate.Session session = (Session) manager.getDelegate();
carlos veintemilla
fonte