2013-08-21 34 views
9

tôi nhận được lỗi ở trên "org.hibernate.ObjectDeletedException: đối tượng đã xóa sẽ được lưu lại theo tầng (loại bỏ đã xóa đối tượng khỏi các liên kết): ". ai đó có thể giúp tôi những gì có thể là vấn đề và những gì cần được sửa chữa?org.hibernate.ObjectDeletedException: đối tượng đã xóa sẽ được lưu lại bằng cách xếp tầng (xóa đối tượng đã xóa khỏi liên kết):

Cảm ơn.

Trả lời

14

Nếu không có mã kết thúc lập bản đồ hơi khó ... Điều này được gây ra, thường là do bạn đang xóa đối tượng liên kết với bộ sưu tập.
Bạn cần phải loại bỏ đối tượng từ việc sở hữu bộ sưu tập (s) và, sau đó, xóa đối tượng

parentObject.collection.remove(objToDelete); 
session.delete(objToDelete); 
session.save(parentObject); 

Nhưng bạn có thể tránh điều này bằng deleteOrphan vào bộ sưu tập ánh xạ trong cách

class ParentObject { 
    @OneToMany(orphanRemoval=true) 
    private List<ChildObject> collection; 
} 

này và mã trông giống như

parentObject.collection.remove(objToDelete); 
session.save(parentObject); 

Bạn không cần xóa đối tượng vì nó sẽ tự động bị xóa bởi Hibernate khi lưu parentObject.

Hy vọng có thể giúp

+1

người dùng ngủ đông nên sử dụng điều này để xóa trẻ mồ côi @Cascade ({org.hibernate.annotations.CascadeType.DELETE_ORPHAN}) – Akhilesh

5

Bạn đã xóa một thực thể (A) trong phiên giao dịch, nhưng nó được tham chiếu bởi một công ty khác và được anotated với một chú thích Cascade. Tham chiếu đó sẽ khiến thực thể (A) được xử lý ngay lập tức. Vì điều này có lẽ không phải là những gì bạn dự định, hibernate phàn nàn.

Giải pháp là tìm tất cả các tham chiếu (bao gồm cả các bộ sưu tập) qua đó thực thể có thể truy cập và đặt chúng thành null/xóa đối tượng khỏi bộ sưu tập.

Bạn có thể biến logic xóa của mình xung quanh: thực hiện tham chiếu (nếu chỉ có một) xóa trẻ mồ côi và chỉ xóa nó ở đó dưới dạng @bellabax được mô tả.

2

Ngoại lệ này cho biết đối tượng mà bạn đang xóa cũng được ánh xạ với bộ sưu tập của bất kỳ thực thể nào và thác của bạn trong tất cả các tập hợp đó. Vì vậy, nếu bạn muốn xóa bất kỳ cách nào bạn có thể thay đổi cascade của bạn để

cascade = CascadeType.DETACH 
0

Nếu bạn đang làm điều này thông qua XML (và không chú thích), dưới đây là một giải pháp mà làm việc cho tôi:

One-to Hội -Nhiều:

  1. Hủy bỏ bất kỳ liên kết của các đối tượng trẻ em từ bất kỳ bộ sưu tập trong đối tượng cha mẹ [Chú ý: Nếu bạn đang làm One-to-One hiệp hội, chỉ thiết lập các tham chiếu đối tượng trẻ em trong đối tượng phụ huynh thành "null"]
  2. Xóa các đối tượng trẻ em từ cơ sở dữ liệu
  3. tuôn ra những thay đổi sử dụng Session.Flush()
  4. liên kết đối tượng phụ huynh đến đối tượng trẻ mới
  5. Lưu đối tượng phụ huynh 6) cam kết những thay đổi

THẬN TRỌNG: phiên.flush() quan trọng vì Hibernate cần xem các thay đổi,

Nếu bạn không thể xóa phiên, tôi khuyên bạn nên thực hiện các bước (1,2) trong một giao dịch khác và sau đó thực hiện các bước (4,5, 6) trong giao dịch mới.

Các vấn đề liên quan