2008-12-11 23 views
5

Cho phép nói rằng tôi có hai bảng - "con" và "cha mẹ" với quan hệ nhiều người. Những gì tôi cần là xóa các mục nhập con nếu bản ghi cha bị xóa.Hibernate: Làm thế nào để làm cho Hibernate xóa hồ sơ từ bảng con khi xóa cha mẹ nếu con được liên kết với cha mẹ với nhiều-một?

Nó không phải là vấn đề nếu tôi liên kết bảng con từ cha mẹ bằng cách tạo liên kết một-nhiều trong parent.hbm và đặt cascade = "all-delete-orphan".

Vấn đề là tôi không muốn mối quan hệ một-nhiều ở phía bên mẹ, vì vậy tôi đã tạo nhiều mối liên hệ ở bên con. Lý do là bảng con là khá lớn và tôi không muốn trích xuất hàng trăm bản ghi mỗi khi tôi sử dụng phụ huynh. Vì vậy, cấu hình của tôi trông như thế này:

child.hbm:

<many-to-one name="parent" class="com.example.Parent" column="parentid"/> 

khi parent.hbm không có hiệp hội với trẻ em.

Câu hỏi đặt ra là: Làm cách nào để tạo bản ghi xóa Hibernate từ bảng con khi xóa cha/mẹ nếu con được liên kết với cha/mẹ với nhiều người?

Cảm ơn.

+0

Tại sao bạn không sử dụng lười biếng một-nhiều trong phụ huynh và chỉ sử dụng tùy chọn xếp tầng? Khi bạn sử dụng phụ huynh, bạn sẽ không tải con. – gcores

+2

Đó là những gì tôi đã suy nghĩ, nhưng tôi sợ nó sẽ mang lại sự nhầm lẫn cho cấu trúc. Tôi sẽ cần phải thêm trường "Set children" vào lớp cha không được sử dụng ở bất kỳ đâu trong mã, chỉ để xóa tầng ngủ đông. Bạn có nghĩ rằng nó là ok? – serg

+0

Vâng, đó là một mối quan hệ hợp lý. Sau khi tất cả các mối quan hệ cha-con không tồn tại. Đặt người đặt riêng tư nếu bạn không muốn phơi bày nó. – gcores

Trả lời

5

Couple lựa chọn:

  • thêm một-nhiều cho phụ huynh với tầng xóa, nhưng giảm thiểu sự mất mát hiệu suất sử dụng tải lười biếng.

  • sử dụng Hibernate Interceptor (hoặc một khía cạnh trong môi trường AOP) để phát hiện việc xóa bản ghi gốc và xóa trẻ em.

Cá nhân tôi sẽ ưu tiên tùy chọn đầu tiên, vì nó cho phép mô hình dữ liệu của bạn phản ánh chặt chẽ hơn mối quan hệ thực trong dữ liệu của bạn.

Chỉnh sửa: có tùy chọn thứ ba, nhưng không dễ chịu - sử dụng trình kích hoạt cơ sở dữ liệu và xóa bộ đệm ẩn Hibernate (hoặc sử dụng phiên không lưu trong bộ nhớ cache).

+0

Tôi đã gần như buộc phải DV sau khi đọc tùy chọn kích hoạt của bạn! Tôi vui vì bạn không bao gồm đó như là một giải pháp thực sự. –

+0

bất kỳ cập nhật nào về việc này thông qua Hibernate? Có ai biết nếu điều này có thể được hỗ trợ tại một số điểm? – Eugen

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