ฉันจะรับวัตถุเซสชันได้อย่างไรถ้าฉันมีผู้จัดการเอนทิตี


107

ฉันมี

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

ฉันจะดึงข้อมูลเซสชันได้อย่างไรหากใช้เอนทิตีเมเนเจอร์หรือฉันจะรับผลลัพธ์จากเกณฑ์ที่แยกออกมาได้อย่างไร


ดูสิ่งนี้ด้วย((EntityManagerImpl)em).getSession();
ashley

คำตอบ:


181

เพื่อให้ครอบคลุมโดยสิ้นเชิงสิ่งต่างๆจะแตกต่างออกไปหากคุณใช้การใช้งาน JPA 1.0 หรือ JPA 2.0

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

ฉันยอมรับว่ามันแย่มากและข้อมูลจำเพาะต้องตำหนิที่นี่ (ไม่ชัดเจนพอ)

JPA 2.0

ด้วย JPA 2.0 มีวิธีการใหม่ (และดีกว่ามาก) EntityManager#unwrap(Class<T>)ที่เป็นที่ต้องการEntityManager#getDelegate()สำหรับแอปพลิเคชันใหม่

ดังนั้นเมื่อใช้ Hibernate เป็นการใช้งาน JPA 2.0 (ดู3.15 Native Hibernate API ) คุณจะต้องทำ:

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

1
entityManager.unwrap(Session.class);อยู่SessionในSession.classอะไร? เป็นการนำเข้าหรือไม่
แพม

ขึ้นอยู่กับการใช้งาน JPA หากคุณใช้ eclipselink มันorg.eclipse.persistence.sessions.Session
albciff

41

ดูหัวข้อ " 5.1. การเข้าถึง Hibernate API จาก JPA " ในคู่มือผู้ใช้ Hibernate ORM :

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

entityManager.unwrap(Session.class);อยู่SessionในSession.classอะไร? เป็นการนำเข้าหรือไม่
แพม

2
เปลี่ยนคู่มือไฮเบอร์เนตแล้ว จุดที่ 15.8 ไม่ให้ข้อมูลเกี่ยวกับการได้รับเซสชันอีกต่อไป
Nicktar

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.unwrap (Session.class)' ใช้เพื่อรับเซสชันจาก EntityManager

@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();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.