2010-03-04 31 views
5

Tôi có một số mã ngủ đông thực hiện chèn vào cơ sở dữ liệu, và khi hoàn thành việc chèn một PostInsertEventListener tùy chỉnh được kích hoạt. (Về cơ bản, kích hoạt để đảm bảo rằng các bản ghi khác được cập nhật một cách thích hợp)Hibernate PostInsertEventListeners -Sử dụng cùng một giao dịch như chèn?

Điều tôi cần làm là làm cho mã bên trong EventListener sử dụng cùng một giao dịch như chèn gốc, để chèn không thành công, EventListener sẽ không cháy.

Tôi đã nghe nói rằng bạn có thể sử dụng các phương pháp javax.transaction.Syncronization và Hibernate's transaction.registerSyncronization() để thực hiện việc này, nhưng không có ví dụ về cách sử dụng ở bất kỳ nơi nào tôi có thể tìm thấy.

Mọi trợ giúp đều được đánh giá cao.

Trả lời

3

Tôi không nghĩ điều này là có thể.

Nếu tôi hiểu, bạn chỉ muốn thực thi một số mã nếu giao dịch đã hoàn tất thành công (đã được cam kết). Tuy nhiên, nếu giao dịch được cam kết, bạn không thể thực hiện điều gì khác trong cùng một giao dịch kể từ khi giao dịch kết thúc.

Tuy nhiên, bạn có thể sử dụng một PreInsertEventListener được gọi trong giao dịch (trước cam kết). Trình nghe sự kiện sẽ kích hoạt sự kiện nếu giao dịch thất bại (vì chúng tôi không biết cho đến khi cam kết nếu giao dịch thành công) nhưng mọi thứ bạn sửa đổi trong trình nghe sẽ không được lưu trữ trong cơ sở dữ liệu nếu giao dịch thất bại. Kiểm tra https://www.hibernate.org/hib_docs/v3/api/org/hibernate/event/EventListeners.html để biết danh sách người nghe.

Một cảnh báo. Bạn không nên làm quá nhiều dữ liệu sửa đổi trong một người nghe. Đặc biệt, bạn không nên kích hoạt bất kỳ tải bộ sưu tập nào.

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