2

アプリケーションで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 型のすべての要素を削除して再挿入しようとしているようです。

4

1 に答える 1

4

どうやら、classC の 1 つを削除しましたが、コレクションの 1 つに残っていました。ここで、Hibernate は何をすべきか混乱しています: あなたはそれを削除しましたが、コレクションには cascade="all" があり (保存を含む)、コレクションを保存します (削除されたオブジェクトを含む)。

classC オブジェクトを直接削除するのではなく、コレクションから削除するか、両方を実行する (削除してコレクションから削除する) 必要があります。

于 2008-11-11T01:20:37.673 に答える