1

バージョン: 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 が何らかの理由で同じであるためです...

誰かアイデアはありますか?

4

1 に答える 1

2

私はあなたのテストの最後のステートメントが assert NOT Null であるべきだと信じています:assertNotNull(dec.getStatusHistory()); // ERROR, is empty like beforeとにかく:

clearセットを削除する代わりに、メソッドを使用する必要があります。

だから使用:

dec.getStatisHistory().clear();
...
assertTrue(dec.getStatusHistoryHistory.isEmpty());

それ以外の:

dec.setStatusHistory(null);
...
assertNull(dec.getStatusHistory());

休止状態では、休止状態で管理されているコレクションを削除することは常に悪い考えです。

ところで、私の意見では、null の代わりに空のセットを使用する方がよりクリーンなアプローチです

追加した

コレクションを本当に削除する必要がある場合に試すことができるのは、追加する前にそのコンテンツを新しいコレクションにコピーすることです。

dec.setStatusHistory(new HashSet(history));
于 2011-01-28T13:40:00.863 に答える