Tôi gặp sự cố khi xóa các phần tử khỏi danh sách được ánh xạ như được mô tả ở trên. Dưới đây là các bản đồ:Vi phạm hạn chế trong bản đồ OneToMany Hibernate một chiều với JoinTable và OrderColumn khi xóa các phần tử
@Entity @Table(name = "foo") class Foo { private List bars; @OneToMany @OrderColumn(name = "order_index") @JoinTable(name = "foo_bar_map", joinColumns = @JoinColumn(name = "foo_id"), inverseJoinColumns = @JoinColumn(name = "bar_id")) @Fetch(FetchMode.SUBSELECT) public List getBars() { return bars; } }
Chèn Bar-trường và tiết kiệm Foo hoạt động tốt, nhưng khi tôi loại bỏ một phần tử từ danh sách và lưu lại, hạn chế duy nhất trên bar_id trong bảng mapping bị vi phạm. SQL-câu sau đây được cấp bởi Hibernate, và những trông khá kỳ quặc:
LOG: execute : delete from foo_bar_map where foo_id=$1 and order_index=$2 DETAIL: parameters: $1 = '4', $2 = '6' LOG: execute S_5: update foo_bar_map set bar_id=$1 where foo_id=$2 and order_index=$3 DETAIL: parameters: $1 = '88', $2 = '4', $3 = '0' ERROR: duplicate key value violates unique constraint "foo_bar_map_bar_id_key"
Các lỗi một cách hoàn hảo làm cho tinh thần, được đưa ra những điều khoản được tạo ra bởi Hibernate (có năm mặt hàng trong danh sách, tôi loại bỏ một trong những đầu tiên và Hibernate xóa hàng ánh xạ với chỉ mục LAST và cố gắng cập nhật các chỉ mục còn lại, bắt đầu từ đầu tiên).
Điều gì sai với ánh xạ ở trên?
Cảm ơn, yeah, đó là những gì tôi cũng phát hiện ra sau một thời gian khá dài trong trình gỡ rối. Như một sửa chữa Tôi đang sử dụng ManyToMany (mà giảm sự hạn chế duy nhất), nhưng nó cảm thấy xấu xí. Điều thú vị là, không ai khác đã gặp vấn đề này, vì tôi cho rằng đây là trường hợp sử dụng phổ biến ... – tbk
@tbh Có, làm cho hiệp hội nhiều người nhiều sẽ giảm ràng buộc duy nhất (để cho phép "nhiều "). Nhưng điều này thực sự là một cách giải quyết, Hibernate nên xử lý một đến nhiều đúng cách. Bạn có thể muốn bỏ phiếu cho vấn đề Jira :) –