2011-01-13 21 views
5

khi kiên trì (cập nhật) một thực thể bạn sẽ gọi EntityManager.persist (thực thể) chuyển pháp nhân hoàn chỉnh. Có thể chặn với @PreUpdate.Cách xác định các thay đổi về thuộc tính thực thể EJB trong @PreUpdate?

Có ai có công thức làm cách nào để xác định thuộc tính nào đã thay đổi trong phương pháp chặn này? Bằng cách nào đó so sánh thực thể cũ và mới? Thậm chí tốt hơn để thực hiện một phương pháp chung thay vì so sánh trường theo trường cho mỗi lớp.

Cảm ơn mọi đầu vào!

Sven

+0

liên quan: http://stackoverflow.com/questions/4586221/tracking-changes-to-db-fields-while-using-orm – javadude

Trả lời

3

Trước hết, persist() dành cho đối tượng mới (chèn) không cập nhật. Bất kỳ đối tượng nào được thay đổi trong ngữ cảnh kiên trì sẽ được cập nhật tự động.

JPA không cung cấp bất kỳ cách thức chuẩn nào để biết điều gì đã thay đổi. Vì vậy, bạn cần tự theo dõi thay đổi hoặc sử dụng API cụ thể của nhà cung cấp JPA.

Trong EclipseLink nếu bạn sử dụng sự kiện preUpdate EclipseLink DescriptorEventListener thay vì sự kiện JPA, bạn sẽ nhận được một ObjectChangeSet gắn với DescriptorEvent chứa các thay đổi.

Một cách khác trong JPA, nếu bạn đang sử dụng dệt, là đưa đối tượng của bạn đến ChangeTracker và gọi hàm _persistence_getPropertyChangeListener() rồi getObjectChangeSet().

Nếu bạn đang sử dụng TopLink Essentials, các sự kiện mô tả cũng được áp dụng, nhưng thay đổi theo dõi không được dệt.

+0

Có cách nào để làm điều gì đó tương tự với Hibernate không? – tazmaniax

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