データベースでかなり複雑なオブジェクト グラフを扱っています。XStream を使用して、正常に動作するこのオブジェクト グラフをシリアル化および逆シリアル化しています。データベースに存在するオブジェクトのオブジェクト グラフをインポートすると、最初は一時的なものです。これは、ID がなく、休止状態がそれを認識していないためです。次に、新しく一時的にインポートされたオブジェクトのどのオブジェクトが既存の永続オブジェクトにマップされるかを判断することで、オブジェクト グラフの一部に ID を設定するビジネス ロジックを作成します。次に、Hibernate の merge() と saveOrUpdate() を使用します。
私が何をしているのかをよりよく理解するための擬似コード:
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);
次のようなエラーが発生するため、これは機能しません。
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]
休止状態のマージは、一時的なオブジェクトを永続的なオブジェクトに関連付けるためのものではないようです。
セッションで永続オブジェクトを取得せずにやりたいことを達成する方法はありますか?一時オブジェクトを変更し、それを保存して既存の永続オブジェクトをオーバーライドするのではなく、それを変更しますか?