2009-10-09 38 views
8

Tôi sẽ triển khai tính năng cập nhật id trong bảng sau khi Hibernate thực hiện xóa. Nhưng tôi muốn nhận được một số phản hồi về cách tiếp cận nào tốt hơn. Ngoài ra bảng tôi đang cập nhật giá trị trong, Hibernate không biết về nó vì vậy tôi sẽ phải làm một bản cập nhật jdbc thẳng - là thậm chí có thể.Hibernate: Event Listener hoặc Interceptor, những ưu điểm/nhược điểm trong thực tế là gì?

Trả lời

8

Theo như việc sử dụng trình lắng nghe/đánh chặn đi, tôi sẽ đi với người nghe - nó linh hoạt hơn về các sự kiện có thể được nghe. Mục đích chính của Interceptor là kiểm tra/thay đổi các thuộc tính đối tượng trước đối với một số sự kiện (ví dụ: xóa); trong khi người nghe có thể được cấu hình để nghe sự kiện "PostDelete" hoặc many others.

Tuy nhiên, nếu bảng nói không được lập bản đồ thì tại sao bạn cần? Thay vào đó, bạn có thể cập nhật nó trực tiếp trong mã của bạn sau khi bạn đã gọi hàm delete() (hoặc sau khi bạn đã gọi flush() nếu có khóa ngoại).

Bạn cũng có thể làm điều đó trong trình kích hoạt (có thể; tùy thuộc vào việc thông tin cần thiết có sẵn trong cơ sở dữ liệu hay không).

+0

Cũng hibernate nhìn thấy một cái nhìn và tôi cần phải vượt qua trong một phiên id trên xóa mà tôi không thể vượt qua trên mệnh đề where. Vì vậy, khi hibernate làm xóa trên xem một "thay vì" kích hoạt chạy nhưng sau khi chạy này tôi cần một số cách để đi qua các id phiên cho người vừa làm xóa vào bảng cơ sở của xem như là một hình thức kiểm toán. Nhưng bảng cơ sở hibernate này không biết gì cả, vì vậy trên @PostDelete tôi có thể thực hiện chèn/cập nhật trên bảng không phải là bảng không? –

+0

Sẽ thử nó ra Mon –

+0

@PostDeleteEvent (được truyền cho người nghe của bạn) mở rộng từ AbstractEvent (https://www.hibernate.org/hib_docs/v3/api/org/hibernate/event/AbstractEvent.html) có một getSession() phương pháp. Vì vậy, bạn có thể sử dụng một 'createSQLQuery()' hoặc định nghĩa SQL của bạn như truy vấn được đặt tên và sử dụng 'getNamedQuery()', thiết lập các tham số cần thiết và thực thi nó. Tôi đã không cố gắng điều này trong PostDeleteListener cụ thể, nhưng tôi không thấy lý do tại sao nó sẽ không hoạt động. – ChssPly76

1

Như tôi biết, Bộ chặn là việc thực hiện cũ của nhóm ngủ đông và người nghe là phiên bản linh hoạt mới của máy đánh chặn. Imho của nó dễ dàng hơn để sử dụng nghe hibernate như Interceptors.

2

Có vẻ như nhiều người thích Người nghe - họ cung cấp danh sách các sự kiện rộng hơn và linh hoạt hơn, nhưng có những thứ mà Người đánh chặn cung cấp và Người nghe không có.

Ví dụ: nếu bạn muốn sửa đổi đối tượng trước khi lưu nó vào cơ sở dữ liệu, nên sử dụng Bộ chặn.

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