Tôi đang cố gắng xóa một thực thể, có liên quan đến các quan hệ khác nhau (Chỉ @ManyToOne
) - Tuy nhiên, Hibernate không xóa bất cứ điều gì - sau khi gọi em.remove
mọi thứ vẫn không thay đổi.Hibernate EntityManager: loại bỏ thực thể tham chiếu không hoạt động
Tôi có 5 đơn vị (E1 - E5
), tham khảo các thực thể (E6
) trong câu hỏi như thế này:
@Entity
public class EX {
@OneToMany(mappedBy = "eX", fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.REMOVE })
private Set<E6> e6s;
}
E6
chính nó có điều ngược lại @ManyToOne
Quan hệ:
public class E6{
@ManyToOne(optional = false)
private E1 e1;
@ManyToOne(optional = false)
private E2 e2;
@ManyToOne(optional = false)
private E3 e3;
@ManyToOne(optional = false)
private E4 e4;
@ManyToOne(optional = false)
private E5 e5;
}
(trái các id, cột bổ sung, v.v ...)
Bất cứ khi nào tôi gọi em.remove(instanceOfE6)
, chỉ cần không có gì xảy ra. Tôi đã thêm Hibernate SQL-Output và không thể thấy một lần thử thực hiện truy vấn DELETE
.
Kể từ khi xóa có thể xảy ra từ một yêu cầu ajax và tươi EntityManager, tôi đã thêm một cuộc gọi đến hợp nhất trước khi xóa, gây otherwhise tôi nhận được một Entity không được quản lý ngoại lệ:
em.remove(em.merge(instanceOfE6));
Nhưng không có gì . Nhà nước vẫn không thay đổi.
Vì vậy, tôi đã cố gắng thêm phương thức @PreRemove
để xóa tất cả các mối quan hệ trước khi xóa thực thể ... Phương thức sẽ không bao giờ được gọi.
Tôi đã thử nhiều hoạt động Cascade khác nhau (bao gồm Cascade.ALL
) - nhưng vì tất cả những gì tôi cần là xóa và vẫn tồn tại, điều đó cũng sẽ hoạt động.
Tôi nghĩ về việc sử dụng một Bản Tuyên Bố Xóa bản địa (mỗi thực thể có một id thay thế, vì vậy mà có thể làm việc rất có thể) - nhưng vì tất cả những gì xảy ra từ bên trong một AJAX gọi, tôi không muốn sử dụng , vì tôi muốn có bản cập nhật Persistence-Cache mà không cần tìm nạp lại mọi Thực thể liên quan ...
Bất kỳ ý tưởng nào?
Nếu bạn cần thêm nguồn, chỉ cần thả cho tôi nhận xét.
Tôi cũng đã cố gắng để loại bỏ các thực thể trong câu hỏi từ tất cả các mối quan hệ (đối tượng khôn ngoan), và gọi em.merge()
trên một trong những đơn vị còn lại, hy vọng rằng Hibernate sẽ whipe thực thể bỏ liên kết - không may mắn.
Bạn đã cam kết giao dịch chưa? –
Bạn đã gọi 'em.flush()'? – jmvivo
@DavidLevesque Chạy Hibernate ở chế độ tự động ... – dognose