2011-12-26 26 views
9

Tôi đang cố gắng thiết lập ứng dụng ngủ đông của mình để duy trì một thực thể Notification mới mỗi Activity Thực thể được tạo ra - tại thời điểm này, mọi thứ tôi đã cố gắng Notification không thể im lặng (không có lỗi trong nhật ký nhưng sql không bao giờ được thực thi) .Có thể duy trì các thực thể mới trong Trình nghe @ Pre/PostPersist không?

Có ai có thể xác nhận rằng thậm chí có thể duy trì các thực thể bổ sung trong trình lắng nghe trước/sauPersist Hibernate không?

Tôi đã đọc trong tài liệu:

Một phương pháp gọi lại không được gọi EntityManager hoặc Query phương pháp!

Nhưng tôi đã đọc một số chủ đề thảo luận khác dường như chỉ ra rằng điều đó là có thể.

Để tham khảo, hai cách tiếp cận tôi đã cố gắng là:

  1. @PrePersist phương pháp - thiết lập một mối quan hệ giữa cascade.ALL ActivityNotification, và trong phương pháp PrePersist chỉ đơn giản là tạo ra một mới Notification và liên kết nó tới các Activity được tạo ra với hy vọng rằng Notification sẽ được duy trì.

  2. @PostPersist phương pháp - sử dụng @Configurable và ListenerClass, hệ thống dây điện trong một dịch vụ và tạo ra một Notification thực thể mới và sau đó gọi một cách rõ ràng entityManger vẫn tồn tại

Ai đó có thể xác nhận những gì tôi đang cố gắng là có thể?

Trả lời

1

Tại sao bạn phải duy trì Notification trong các chức năng @PrePersist hoặc @PostPersist? Các mã sau đây nên tồn tại cả hai thực thể:

@Entity 
public class Activity implements Serializable { 
    @OneToOne(cascade={CascadeType.PERSIST}) 
    private Notification notification; 
} 

@Entity 
public class Notification implements Serializable { } 

@Stateless 
public class MrBean implements MrBeanInterface { 
    @PersistenceContext() 
    private EntityManager em; 

    public void persistActivity() { 
     Activity act = new Activity(); 
     act.setNotification(new Notification()); 
     em.persist(act); 
    } 
} 

CẬP NHẬT: bạn có thể thử tạo ra các liên kết bên trong constructor của Hoạt động như thế này:

@Entity 
public class Activity implements Serializable { 
    @OneToOne(cascade={CascadeType.PERSIST}) 
    private Notification notification; 

    public Activity() { 
     this.notification = new Notification(); 
    } 
} 

@Entity 
public class Notification implements Serializable { } 

@Stateless 
public class MrBean implements MrBeanInterface { 
    @PersistenceContext() 
    private EntityManager em; 

    public void persistActivity() { 
     Activity act = new Activity(); 
     em.persist(act); 
    } 
} 

Một điều cần lưu ý là tôi nghĩ rằng bạn không thể sử dụng @PostPersist. Để chính xác hơn, bạn phải liên kết Notification đến Activity trước khi lưu giữ Activity để cascade={CascadeType.PERSIST} hoạt động.

+0

Cảm ơn - Tôi cần thêm Thông báo vào phương thức pre/postPersist vì tôi muốn chắc chắn rằng mỗi khi một Hoạt động được tạo, một Thông báo tương ứng cũng được tạo. Nếu bạn coi Thông báo là đối tượng kiểm toán cần được đảm bảo, thì giải pháp đầu tiên có nguy cơ ai đó có thể gọi em.persist (hành động); bất cứ nơi nào khác trong codebase (một lô/lớp hoạt động hoặc chỉ bất kỳ lớp dịch vụ khác) và trừ khi họ cũng thêm mã thông báo sau đó chúng tôi không nhận được kiểm toán của chúng tôi. Giải pháp thứ hai là những gì tôi đã thử cho phương pháp tiếp cận của tôi 1) trong bài đăng gốc nhưng không hoạt động âm thầm. – rhinds

+0

@rhinds Tôi vừa cập nhật câu trả lời của mình. Bạn có thể tạo liên kết trong hàm tạo của Activity. –

+0

cảm ơn, tôi sẽ cố gắng này - mặc dù nó vẫn có vẻ như nó sẽ không được lý tưởng như vẫn sẽ được mở để chỉnh sửa trước khi sự bền bỉ. Có vẻ như trước đây vẫn là nơi thích hợp để thực hiện loại hoạt động này, ví dụ, trước đây chúng tôi đã sử dụng phương pháp prePersist để đặt ngày sửa đổi của tất cả các đối tượng và có nghĩa là ngày sửa đổi không bao giờ có thể được thay đổi hoặc ghi đè theo cách thủ công – rhinds

2

Bạn có thể duy trì các thực thể bổ sung trong trình lắng nghe sự kiện Hibernate (chèn, cập nhật, tuôn ra, vv) với giao diện StatelessSession. Nhưng tôi không biết liệu điều này cũng có thể thực hiện với mã chỉ JPA nghiêm ngặt (EntityManagerFactoryEntityManager).

+0

Có, nó là thực hiện cụ thể, nhưng Hibernate và EclipseLink cả hai đều có một cái gì đó tương tự. – wrschneider

+0

Cảm ơn - điều này có phù hợp với thời gian chạy không? Tôi nhận thấy các tài liệu tham khảo nó như là một giao diện hoạt động hàng loạt và không sử dụng bất kỳ bộ nhớ đệm cấp độ đầu tiên/thứ hai .. – rhinds

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