Tôi đang xử lý biểu đồ đối tượng khá phức tạp trong cơ sở dữ liệu của mình. Tôi đang sử dụng XStream để serialize và deserialize đồ thị đối tượng này hoạt động tốt. Khi tôi nhập một biểu đồ đối tượng của một đối tượng tồn tại trong cơ sở dữ liệu, nó ban đầu thoáng qua, vì không có ID và hibernate không biết gì về nó. Sau đó tôi có logic nghiệp vụ đặt ID trên các phần của đồ thị đối tượng của tôi bằng cách tìm ra các đối tượng nào trong bản đồ đối tượng được chuyển đổi mới nhất sang các đối tượng liên tục hiện có. Sau đó tôi sử dụng hợp nhất Hibernate() và saveOrUpdate().Sử dụng thực thể thoáng qua trong Hibernate để cập nhật/Hợp nhất đối tượng liên tục hiện có
Một số giả để cung cấp cho bạn một ý tưởng tốt hơn về những gì tôi đang làm:
ComplexObject transObj = xstream.import("object.xml");
ComplexObject persistObj = someService.getObjByName(transObj.getName());
for (OtherObject o : c.getObjects()) {
if (persistObj.getObjects().contains(o.getName())) {
o.setId(persistObj.getObjectByName(o.getName()).getId())
}
... set a bunch of other IDs deeper in the object graph ...
}
transObj = session.merge(transObj);
session.saveOrUpdate(transObj);
Bây giờ điều này không làm việc khi tôi nhận được lỗi như:
org.springframework.dao.InvalidDataAccessApiUsageException: deleted object would be re-saved by cascade (remove deleted object from associations): [com.......SomeObject#353296]; nested exception is org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [com.......SomeObject#353296]
và nó có vẻ như hợp nhất hibernate không có nghĩa là kết hợp các đối tượng tạm thời với các đối tượng liên tục.
Có cách nào để đạt được những gì tôi muốn làm mà không cần phải nhận đối tượng liên tục trong phiên và sửa đổi, thay vì sửa đổi tạm thời và cố gắng lưu và ghi đè liên tục hiện tại?
Đó là cách tôi sẽ giải quyết nó: http://stackoverflow.com/questions/4779239/update-persistent-object-with-transient-object-using-hibernate - vì lý do hiệu suất mà bạn nên một trong hai bộ nhớ cache dữ liệu phản ánh/introspection hoặc tạo một trình tạo lớp từ các thực thể của bạn. – user1050755
Có một setId luôn luôn là một ý tưởng tồi ...? – Rob
user1050755, điều duy nhất về giải pháp đó là nó dường như không thể xử lý các thác phức tạp, một-nhiều, vv Tôi tưởng tượng điều này sẽ chỉ làm việc cho một cấu trúc kiểu không đồ thị, nhưng sửa tôi nếu tôi 'tôi sai. – eipark