Comment puis-je obtenir l'objet de session si j'ai le gestionnaire d'entités

107

j'ai

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

Comment puis-je récupérer la session si j'utilise entitymanager ou comment puis-je obtenir le résultat de mes critères détachés?

storm_buster
la source
Voir aussi((EntityManagerImpl)em).getSession();
ashley

Réponses:

181

Pour être totalement exhaustif, les choses sont différentes si vous utilisez une implémentation JPA 1.0 ou JPA 2.0.

JPA 1.0

Avec JPA 1.0, vous devrez utiliser EntityManager#getDelegate(). Mais gardez à l'esprit que le résultat de cette méthode est spécifique à l'implémentation, c'est-à-dire non portable d'un serveur d'application utilisant Hibernate à l'autre. Par exemple avec JBoss vous feriez:

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

Mais avec GlassFish , vous devrez faire:

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

Je suis d'accord, c'est horrible, et la spécification est à blâmer ici (pas assez claire).

JPA 2.0

Avec JPA 2.0, il existe une nouvelle (et bien meilleure) EntityManager#unwrap(Class<T>)méthode à privilégier par rapport EntityManager#getDelegate()aux nouvelles applications.

Donc, avec Hibernate comme implémentation JPA 2.0 (voir 3.15. API Native Hibernate ), vous feriez:

Session session = entityManager.unwrap(Session.class);
Pascal Thivent
la source
1
entityManager.unwrap(Session.class);ce qui est Sessionen Session.class? est-ce une importation?
Thang Pham
Dépend de la mise en œuvre de JPA, si vous utilisez eclipselink c'estorg.eclipse.persistence.sessions.Session
albciff
41

Consultez la section " 5.1. Accéder aux API Hibernate depuis JPA " dans le Guide de l'utilisateur Hibernate ORM :

Session session = entityManager.unwrap(Session.class);
Vladimir Ivanov
la source
entityManager.unwrap(Session.class);ce qui est Sessionen Session.class? est-ce une importation?
Thang Pham
2
Le manuel Hibernate a changé. Le point 15.8 ne donne plus d'informations sur l'obtention d'une session.
Nicktar
1
Depuis janvier 2019, le manuel Hibernate actuel (5.3.7), §5.1, indique toujours cela comme le moyen d'obtenir une référence à un objet Session.
Alain BECKER
5

Cela expliquera mieux.

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

'entityManager.unwrap (Session.class)' est utilisé pour obtenir une session à partir d'EntityManager.

@Repository
@Transactional
public class EmployeeRepository {

  @PersistenceContext
  private EntityManager entityManager;

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

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

}

Lien d' application de démonstration .

Hari Krishna
la source
-1

Je travaillais chez Wildfly mais j'utilisais

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

et le correct était

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