Varlık yöneticisine sahipsem oturum nesnesini nasıl alabilirim


107

Sahibim

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

Entitymanager kullanıyorsam oturumu nasıl geri alabilirim veya ayrılmış ölçütlerimden sonucu nasıl alabilirim?


Ayrıca bakınız((EntityManagerImpl)em).getSession();
ashley

Yanıtlar:


181

Tamamen kapsamlı olmak gerekirse, bir JPA 1.0 veya JPA 2.0 uygulaması kullanıyorsanız işler farklıdır.

JPA 1.0

JPA 1.0 ile kullanmanız gerekir EntityManager#getDelegate(). Ancak , bu yöntemin sonucunun uygulamaya özgü olduğunu, yani Hibernate kullanan uygulama sunucusundan diğerine taşınamayacağını unutmayın. Örneğin JBoss ile şunları yaparsınız:

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

Ancak GlassFish ile yapmanız gerekenler:

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

Kabul ediyorum, bu korkunç ve şartname burada suçlu (yeterince açık değil).

JPA 2.0

JPA 2.0 ile, yeni uygulamalar için EntityManager#unwrap(Class<T>)tercih edilecek yeni (ve çok daha iyi) bir yöntem var EntityManager#getDelegate().

Dolayısıyla, JPA 2.0 uygulaması olarak Hibernate ile (bkz. 3.15. Native Hibernate API ) şunları yaparsınız:

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

1
entityManager.unwrap(Session.class);ne Sessionde Session.class? bu bir ithalat mı?
Thang Pham

Eclipselink kullanıyorsanız JPA uygulamasına bağlıdırorg.eclipse.persistence.sessions.Session
albciff

41

Bölümüne "Bkz . JPA 5.1 Erişim hazırda API'leri içinde" Hazırda ORM Kullanıcı Kılavuzu :

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

entityManager.unwrap(Session.class);ne Sessionde Session.class? bu bir ithalat mı?
Thang Pham

2
Hazırda Bekletme Kılavuzu değişti. 15.8 noktası artık bir oturum edinme hakkında herhangi bir bilgi vermemektedir.
Nicktar

1
Ocak 2019 itibarıyla Hibernate akım (5.3.7) el kitabı, §5.1, bunu hala bir Oturum nesnesine referans elde etmenin yolu olarak belirtmektedir.
Alain BECKER

5

Bu daha iyi açıklayacaktır.

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

0

EntityManager'dan oturum almak için 'entityManager.unwrap (Session.class)' kullanılır.

@Repository
@Transactional
public class EmployeeRepository {

  @PersistenceContext
  private EntityManager entityManager;

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

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

}

Demo Uygulama bağlantısı .


-1

Wildfly'da çalışıyordum ama kullanıyordum

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

ve doğru olan

org.hibernate.Session session = (Session) manager.getDelegate();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.