Trong một dự án dựa trên Spring/Hibernate, chúng tôi có mối quan hệ một-nhiều giữa hai thực thể. Các hoạt động bắt buộc là:Có nên tránh các liên kết hai chiều Hibernate?
- tìm cha mẹ của đứa trẻ;
- tìm con của cha mẹ;
- khi cha mẹ bị xóa, chúng tôi cũng cần xóa con;
- tạo hàng loạt trẻ em.
Chúng tôi đã đưa ra hai cách để thực hiện việc này.
Bidirectional association: thực thể con có
@ManyToOne
cột liên kết nó với cha mẹ, và phụ huynh có@OneToMany
bộ sưu tập lười biếng-nạp của trẻ em. Tất cả các hoạt động trên có thể được thực hiện trong các mô hình:child.getParent(); parent.getChildren(); //lazy loading session.delete(parent); //cascade removal of the children does the trick here session.save(parent); //cascade persist created the children
Unidirectional hiệp hội: thực thể con có
@ManyToOne
cột liên kết nó với cha mẹ, nhưng phụ huynh không có bất kỳ liên kết đến trẻ em. Hầu hết các hoạt động sẽ được thực hiện trong các phương pháp dịch vụ:child.getParent(); //still in the model Collection<Child> findChildren(Parent parent); //service method in ChildService void deleteChildren(Parent parent); //service method in ChildService void createChild(Parent parent, ... childAttributes); //service method in ChildService invoked for each new child.
Phương pháp đầu tiên có vẻ là dễ dàng hơn để thực hiện (bạn có thể tái sử dụng Hibernate chức năng tầng) nhưng một số người trong chúng ta thấy các hiệp hội hai chiều như một nguyên nhân tiềm ẩn của các vấn đề .
Điều gì sẽ là lựa chọn thiết kế tốt hơn? Có bất kỳ vấn đề, hiệu suất hay thiết kế nổi tiếng nào, được tạo ra bởi phương pháp hai chiều không?
Bạn có biết nguồn nào giải thích cách làm việc lười biếng không? Tôi đã gặp rắc rối với điều này trong một dự án JSF. –
"một số người trong chúng ta thấy các hiệp hội hai chiều là một nguyên nhân tiềm ẩn của các vấn đề" - bạn có thể đặt tên cho những vấn đề tiềm năng này không? –