Làm cách nào để lấy đối tượng phiên nếu tôi có trình quản lý thực thể


107

Tôi có

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

Làm cách nào để truy xuất phiên nếu đang sử dụng entitymanager hoặc làm cách nào để lấy kết quả từ các tiêu chí tách rời của mình?


Xem thêm((EntityManagerImpl)em).getSession();
ashley

Câu trả lời:


181

Nói một cách tổng thể, mọi thứ sẽ khác nếu bạn đang sử dụng triển khai JPA 1.0 hoặc JPA 2.0.

JPA 1.0

Với JPA 1.0, bạn phải sử dụng EntityManager#getDelegate(). Nhưng hãy nhớ rằng kết quả của phương pháp này là triển khai cụ thể, tức là không di động từ máy chủ ứng dụng bằng chế độ Hibernate sang máy chủ khác. Ví dụ với JBoss bạn sẽ làm:

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

Nhưng với GlassFish , bạn phải làm:

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

Tôi đồng ý, điều đó thật kinh khủng, và thông số kỹ thuật đáng trách ở đây (không đủ rõ ràng).

JPA 2.0

Với JPA 2.0, có một EntityManager#unwrap(Class<T>)phương pháp mới (và tốt hơn nhiều) được ưu tiên hơn EntityManager#getDelegate()cho các ứng dụng mới.

Vì vậy, với triển khai Hibernate dưới dạng JPA 2.0 (xem 3.15. API Hibernate Native ), bạn sẽ thực hiện:

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

1
entityManager.unwrap(Session.class);cái gì Sessionở trong Session.class? nó là một nhập khẩu?
Thang Pham

Phụ thuộc vào việc triển khai JPA, nếu bạn đang sử dụng liên kết eclipsel thì đó làorg.eclipse.persistence.sessions.Session
albciff

41

Xem phần " 5.1. Truy cập API Hibernate từ JPA " trong Hướng dẫn sử dụng Hibernate ORM :

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

entityManager.unwrap(Session.class);cái gì Sessionở trong Session.class? nó là một nhập khẩu?
Thang Pham

2
Hướng dẫn sử dụng Hibernate đã thay đổi. Điểm 15.8 không còn cung cấp bất kỳ thông tin nào về việc có được một phiên.
Nicktar

1
Kể từ tháng 1 năm 2019, hướng dẫn sử dụng Hibernate hiện tại (5.3.7), §5.1, vẫn nêu rõ đây là cách để lấy tham chiếu đến đối tượng Session.
Alain BECKER

5

Điều này sẽ giải thích tốt hơn.

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

0

'entityManager.unwrap (Session.class)' được sử dụng để lấy phiên từ EntityManager.

@Repository
@Transactional
public class EmployeeRepository {

  @PersistenceContext
  private EntityManager entityManager;

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

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

}

Liên kết Demo Ứng dụng .


-1

Tôi đã làm việc trong Wildfly nhưng tôi đang sử dụng

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

và đúng là

org.hibernate.Session session = (Session) manager.getDelegate();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.