2010-03-29 28 views
8

Tôi đã viết phương thức EJB không trạng thái cho phép nhận thực thể ở chế độ "chỉ đọc".Tách một thực thể khỏi ngữ cảnh kiên trì JPA (JPA 2.0/Hibernate/EJB 3/J2EE 6)

Cách để thực hiện việc này là để có được thực thể với EntityManager sau đó tách nó ra (bằng cách sử dụng JPA 2.0 EntityManager).

Mã của tôi là như sau:

@PersistenceContext 
private EntityManager entityManager; 

public T getEntity(int entityId, Class<T> specificClass, boolean readOnly) throws Exception{ 
    try{ 
    T entity = (T)entityManager.find(specificClass, entityId); 
    if (readOnly){ 
     entityManager.detach(entity); 
    } 
    return entity; 
    }catch (Exception e){ 
    logger.error("", e); 
    throw e; 
    } 
} 

Lấy thực thể hoạt động tốt, nhưng cuộc gọi đến phương pháp detach trả về lỗi sau:

GRAVE: javax.ejb.EJBException 
    at ... 
Caused by: java.lang.AbstractMethodError: org.hibernate.ejb.EntityManagerImpl.detach(Ljava/lang/Object;)V 
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.detach(EntityManagerWrapper.java:973) 
    at com.mycomp.dal.MyEJB.getEntity(MyEJB.java:37) 

tôi không thể nhận thêm thông tin và không hiểu vấn đề là gì ...

Ai đó có thể trợ giúp?

Trả lời

7

Tôi giả sử bạn đang sử dụng JPA 2.0 với phiên bản Hibernate không chính xác, không thực hiện thông số kỹ thuật JPA 2.0. Ngoại lệ cho biết rằng EntityManagerImpl không có phương thức bắt buộc.

Tôi đề xuất nâng cấp ngủ đông lên 3,5, đây là triển khai JPA 2.0.

+0

Cảm ơn! Chỉ cần cập nhật JAR Hibernate của tôi lên 3.5.0 CR2 và nó hoạt động rất tốt. – Julien

+0

Thao tác tách có đệ quy (tức là trong tầng)? –

+0

@Guido - vâng, nếu bạn có cascadeType = DETACH – Bozho

1

Bạn có thể tách tất cả các thực thể rõ ràng nhưng tách riêng chỉ một thực thể không có trong JPA 2.0. http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html

Bạn có thể đã ngủ đông impl trong xây dựng đường dẫn của bạn, và một người khác thực hiện trên máy chủ ứng dụng của bạn (EclipseLink? Hoặc phiên bản cũ ngủ đông) ...

Các entityManager.detach(...) là trong Hibernate nhưng không phải trong JPA vì vậy bạn cần hibernate impl trên máy chủ ứng dụng của bạn để sử dụng chức năng này ...

+0

Câu trả lời từ Bozho đã giải quyết được vấn đề của tôi. Tách một thực thể duy nhất hoạt động FINE trong JPA 2.0 (J2EE 6) – Julien

+0

Lỗi lầm của tôi là bạn đang ở trong giao diện JPA 2.0 –

Các vấn đề liên quan