バージョン: 3.6.0.final
次のような状況があります: カスケードが完全に有効になっている、値型オブジェクトを含むコレクションを持つエンティティ。
1)コレクションを削除して、データベースに保存します。次に、それをロードして、コレクションが実際に削除されていることを確認します。2) 次に、削除されたコレクションを追加し、エンティティを再度保存します。次に、再度ロードして結果を確認し、コレクションが空であってはならないことに気付きます:(...何が間違っているのですか、それともバグですか? 2)でクリーンに作成されたコレクションを使用すると、 Hibernate オブジェクトが存在しません。正常に動作します。つまり、コレクションはデータベースに正しく格納されます。
コードでは、私のマッピング:
<class name="com.sample.Declaration" table="decl">
<id name="id" column="id" type="string" length="40" access="property">
<generator class="assigned" />
</id>
<set name="statusHistory" table="decl_sts_hist" lazy="false" cascade="all">
<cache usage="read-write" />
<key column="idDec" not-null="true" />
<composite-element class="com.sample.DeclarationStatusDefault">
<property name="remark" column="remark" type="string" length="254" />
<property name="statusName" column="stsName" type="declarationStatusName" not-null="true" update="false" />
</composite-element>
</set>
</class>
コード:
// 1): clear the status history
Declaration dec = Persister.findDeclarationById("id");
SortedSet<DeclarationStatus> history = dec.getStatusHistory();
dec.setStatusHistory(null);
dec.saveOrUpdate(); // will call saveOrUpdate on the current session.
Declaration dec = Persister.findDeclarationById("id");
assertNull(dec.getStatusHistory()); // OK
// 2) recover the status history
dec.setStatusHistory(history);
dec.saveOrUpdate(); // will call saveOrUpdate on the current session.
Declaration dec = Persister.findDeclarationById("id");
assertNotNull(dec.getStatusHistory()); // ERROR, is empty like before
いくつかのエントリで新しいセットを作成して保存すると、すべて正常に動作しますが、PersistSet などの Hibernate オブジェクトを含む古い履歴を保存すると、db に保存されません...奇妙な... . これは予想される動作ですか?... バグのようなにおいがするか、ここに何かが欠けています...
Hibernate コードをデバッグすると、メソッド Collections.prepareCollectionForUpdate() でコレクション エントリが更新/再作成としてマークされることはありません。これは、loadedPersister と currentPersister が何らかの理由で同じであるためです...
誰かアイデアはありますか?