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?


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);

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);

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);

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 .


-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();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.