tôi có những thực thểHibernate - thanh toán bù trừ một bộ sưu tập với tất cả-xóa-mồ côi và sau đó thêm vào nó gây ra ConstraintViolationException
class Foo{
Set<Bar> bars;
}
class Bar{
Foo parent;
String localIdentifier;
}
Với bản đồ này (xin lỗi, không có chú thích, tôi cũ lỗi thời):
<class name="Foo">
...
<set name="bars" cascade="all-delete-orphan" lazy="false" inverse="true">
<key>...</key>
<one-to-many class="Bar"/>
</set>
</class>
<class name="Bar">
...
<property name="localIdentifier" column="local_identifier"/>
<many-to-one name="parent" column="parent_id" />
</class>
tôi cũng có một hạn chế duy nhất trên 2 cột: local_identifier
và parent_id
(không phải là một Constrain độc đáo trên từng, nhưng một Constrain độc đáo duy nhất có chứa cả hai, ví dụ như không có 2 hàng với cùng phụ huynh và cùng localIdentifier được phép)
alter table bar add constraint unique_bar unique (parent_id, local_identifier)
Và mã này có sử dụng chúng:
//foo is persistent, foo id = 1
Bars bars = foo.getBars();
bars.clear(); // bars contained 1 item [parent_id = 1, local_identifier = "a"]
Bar newBar = new Bar();
newBar.setParent(foo);
newBar.setLocalIdentifier("a");
bars.add(newBar);
Bây giờ, đối với một số lý do, Hibernate không thực hiện mọi thứ theo thứ tự chúng được gọi. Nó không thực hiện clear()
(xóa) trước khi add()
(insert) nhưng ngược lại, đầu tiên nó sẽ cố gắng để chèn, nhận được một ConstraintViolationException
tôi biết thêm một chút session.flush()
sau bars.clear();
, có thể khắc phục điều này, nhưng trong trường hợp này , Tôi không có quyền truy cập vào phiên theo cách không xấu.
Vì vậy, là tuôn ra là giải pháp duy nhất? hoặc là có một phiên bản Hibernate tôn trọng thứ tự của hành động?
Cập nhật: Bằng cách này, dereferencing bộ sưu tập sẽ dẫn đến một HibernateException từ https://www.hibernate.org/117.html#A3:
tôi nhận được HibernateException: Đừng dereference một bộ sưu tập với thác = "all-xóa -orphan " Điều này sẽ xảy ra nếu bạn tải một đối tượng với một bộ sưu tập cascade =" all-delete-orphan " và sau đó xóa tham chiếu vào bộ sưu tập. Không thay thế bộ sưu tập này, sử dụng rõ ràng() để thuật toán xóa bỏ trẻ mồ côi có thể phát hiện thay đổi của bạn.
Tôi nghĩ rằng xả nước là lựa chọn duy nhất ở đây – ruchirhhi
Tương đối [Hibernate Forum topic] (https://forum.hibernate.org/viewtopic.php?t=934483). –