Come posso ottenere l'oggetto sessione se ho il gestore entità


107

io ho

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

Come posso recuperare la sessione se sto utilizzando entitymanager o come posso ottenere il risultato dai miei criteri scollegati?


Vedi anche((EntityManagerImpl)em).getSession();
ashley

Risposte:


181

Per essere totalmente esaustivi, le cose sono diverse se stai usando un'implementazione JPA 1.0 o JPA 2.0.

JPA 1.0

Con JPA 1.0, dovresti usare EntityManager#getDelegate(). Ma tieni presente che il risultato di questo metodo è specifico dell'implementazione, cioè non portabile dall'application server usando Hibernate all'altro. Ad esempio con JBoss faresti:

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

Ma con GlassFish , dovresti fare:

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

Sono d'accordo, è orribile, e qui la colpa è delle specifiche (non abbastanza chiare).

JPA 2.0

Con JPA 2.0, c'è un nuovo (e molto migliore) EntityManager#unwrap(Class<T>)metodo da preferire EntityManager#getDelegate()per le nuove applicazioni.

Quindi, con Hibernate come implementazione JPA 2.0 (vedi 3.15. Native Hibernate API ), dovresti fare:

Session session = entityManager.unwrap(Session.class);

1
entityManager.unwrap(Session.class);cosa c'è Sessiondentro Session.class? è un'importazione?
Thang Pham

Dipende dall'implementazione JPA, se stai usando eclipselink èorg.eclipse.persistence.sessions.Session
albciff

41

Consulta la sezione " 5.1. Accesso alle API di Hibernate da JPA " nella Guida per l'utente di Hibernate ORM :

Session session = entityManager.unwrap(Session.class);

entityManager.unwrap(Session.class);cosa c'è Sessiondentro Session.class? è un'importazione?
Thang Pham

2
Il manuale di ibernazione è cambiato. Il punto 15.8 non fornisce più alcuna informazione su come ottenere una sessione.
Nicktar

1
A partire da gennaio 2019, il manuale corrente di Hibernate (5.3.7), §5.1, afferma ancora questo come il modo per ottenere un riferimento a un oggetto Session.
Alain BECKER

5

Questo spiegherà meglio.

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

0

"entityManager.unwrap (Session.class)" viene utilizzato per ottenere la sessione da EntityManager.

@Repository
@Transactional
public class EmployeeRepository {

  @PersistenceContext
  private EntityManager entityManager;

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

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

}

Link dell'applicazione demo .


-1

Lavoravo in Wildfly ma stavo usando

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

e la corretta era

org.hibernate.Session session = (Session) manager.getDelegate();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.