Trực tiếp từ documentation. Điều này giải thích vấn đề của bạn chính xác tôi tin rằng:
Tuy nhiên, mã này
Parent p = (Parent) session.Load(typeof(Parent), pid);
// Get one child out of the set
IEnumerator childEnumerator = p.Children.GetEnumerator();
childEnumerator.MoveNext();
Child c = (Child) childEnumerator.Current;
p.Children.Remove(c);
c.Parent = null;
session.Flush();
sẽ không loại bỏ c từ cơ sở dữ liệu; nó sẽ chỉ xóa liên kết đến p (và gây ra một sự vi phạm ràng buộc NOT NULL, trong trường hợp này). Bạn cần xóa một cách rõ ràng() con.
Parent p = (Parent) session.Load(typeof(Parent), pid);
// Get one child out of the set
IEnumerator childEnumerator = p.Children.GetEnumerator();
childEnumerator.MoveNext();
Child c = (Child) childEnumerator.Current;
p.Children.Remove(c);
session.Delete(c);
session.Flush();
Bây giờ, trong trường hợp của chúng tôi, Trẻ em không thể thực sự tồn tại mà không có cha mẹ. Vì vậy, nếu chúng tôi xóa một Trẻ em khỏi bộ sưu tập, chúng tôi thực sự muốn nó bị xóa. Đối với điều này, chúng ta phải sử dụng cascade = "all-delete-orphan".
<set name="Children" inverse="true" cascade="all-delete-orphan">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>
Edit:
Liên quan đến những thứ nghịch đảo, tôi tin rằng đây chỉ xác định cách sql được tạo ra, hãy xem doc để biết thêm.
Một điều cần lưu ý là, có bạn đã
not-null="true"
trên nhiều-một mối quan hệ trong cấu hình Hibernate của bạn?
Bạn có thể sẽ hiển thị các phần liên quan của ánh xạ. Tôi sử dụng tất cả-xóa-mồ côi tất cả các thời gian với các phím ngoài không null và chưa bao giờ có một vấn đề. –