アプリケーションでSpringでHibernateを使用しています。私は一貫してデタッチされたオブジェクトを使用しており、データベースを呼び出す必要があるときはいつでもそれらを再アタッチしています。休止状態のテンプレートを使用して、接続を管理しています。
私のデータ構造は次のとおりです。
classA:
<one-to-many name="classB" inverse="true" cascade="all,delete-orphan" lazy="true">
classB:
<one-to-many name="classC" inverse="true" cascade="all,delete-orphan" lazy="false" fetch="subselect">
次の呼び出しを行うと、classB または classC の一部の項目が変更された可能性があるため、エラーが発生します。
classA a = (classA)hibernateTemplate.merge(newClassA);
私が得るエラーは次のとおりです。
[11/10/08 12:08:39:126 EST] 00000024 SystemOut O 2008-11-10 12:08:38,876 - - ca.thedominion.cfa.persistence.hibernate.ClassADAOImpl :updateClassA Technical Exception occurred:
org.springframework.dao.InvalidDataAccessApiUsageException: deleted object would be re-saved by cascade (remove deleted object from associations): [ca...classC#715590]; nested exception is org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [ca...classC#715590]
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:639)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.merge(HibernateTemplate.java:820)
これがエラーを生成する理由を誰かに説明してもらえますか? 私が理解しているように、マージはツリー内のどのオブジェクトが変更されたかを判断し、それらを更新/削除/挿入し、他のオブジェクトを削除して再挿入しようとしないでください。しかし、これは classC 型のすべての要素を削除して再挿入しようとしているようです。