यदि मेरे पास इकाई-प्रबंधक है तो मैं सत्र वस्तु कैसे प्राप्त कर सकता हूं


107

मेरे पास है

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

यदि मैं शस्त्रागार का उपयोग कर रहा हूं या मैं अपने अलग किए गए मानदंड से परिणाम कैसे प्राप्त कर सकता हूं?


यह भी देखें((EntityManagerImpl)em).getSession();
ashley

जवाबों:


181

पूरी तरह से संपूर्ण होने के लिए, यदि आप JPA 1.0 या JPA 2.0 कार्यान्वयन का उपयोग कर रहे हैं तो चीजें अलग हैं।

जेपीए 1.0

JPA 1.0 के साथ, आपको उपयोग करना होगा EntityManager#getDelegate()। लेकिन ध्यान रखें कि इस पद्धति का परिणाम हाइबरनेट का उपयोग करके दूसरे सर्वर के लिए विशिष्ट यानी गैर पोर्टेबल कार्यान्वयन हैJBoss के साथ उदाहरण के लिए आप क्या करेंगे:

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

लेकिन GlassFish के साथ , आपको करना होगा:

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

मैं सहमत हूँ, यह भयानक है, और कल्पना यहाँ दोष देने के लिए है (पर्याप्त स्पष्ट नहीं)।

जेपीए 2.0

JPA 2.0 के साथ, एक नया (और बहुत बेहतर) EntityManager#unwrap(Class<T>)तरीका है जिसे EntityManager#getDelegate()नए अनुप्रयोगों के लिए प्राथमिकता दी जानी है ।

तो Jiber 2.0 के कार्यान्वयन के रूप में हाइबरनेट के साथ ( 3.15 देखें । मूल हाइबरनेट API ), आप ऐसा करेंगे:

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

1
entityManager.unwrap(Session.class);क्या है Sessionमें Session.class? क्या यह आयात है?
थांग फाम

जेपीए कार्यान्वयन पर निर्भर करता है, यदि आप ग्रहण का उपयोग कर रहे हैं तो यह हैorg.eclipse.persistence.sessions.Session
एल्बसिफ़

41

हाइबरनेट ORM उपयोगकर्ता गाइड में " 5.1। जेपीए से हाइबरनेट एपीआई को एक्सेस करना " अनुभाग देखें :

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

entityManager.unwrap(Session.class);क्या है Sessionमें Session.class? क्या यह आयात है?
थांग फाम १३'११ को

2
हाइबरनेट मैनुअल बदल गया। बिंदु 15.8 अब एक सत्र प्राप्त करने के बारे में कोई जानकारी नहीं देता है।
निकार २

1
जनवरी 2019 तक, हाइबरनेट वर्तमान (5.3.7) मैनुअल, ,5.1, अभी भी इसे एक सत्र वस्तु का संदर्भ प्राप्त करने का तरीका बताता है।
Alain BECKER

5

यह बेहतर तरीके से समझाएगा।

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

0

EntityManager से सत्र प्राप्त करने के लिए 'UnitManager.unwrap (Session.class)' का उपयोग किया जाता है।

@Repository
@Transactional
public class EmployeeRepository {

  @PersistenceContext
  private EntityManager entityManager;

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

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

}

डेमो आवेदन लिंक


-1

मैं Wildfly में काम कर रहा था लेकिन मैं उपयोग कर रहा था

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

और सही था

org.hibernate.Session session = (Session) manager.getDelegate();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.