私はこれらのエンティティを持っています
class Foo{
Set<Bar> bars;
}
class Bar{
Foo parent;
String localIdentifier;
}
このマッピングでは(申し訳ありませんが、注釈はありません。私は時代遅れです):
<class name="Foo">
...
<set name="bars" cascade="all-delete-orphan" lazy="false" inverse="true">
<key>...</key>
<one-to-many class="Bar"/>
</set>
</class>
<class name="Bar">
...
<property name="localIdentifier" column="local_identifier"/>
<many-to-one name="parent" column="parent_id" />
</class>
また、2 つの列に一意の制約があります: local_identifier
and parent_id
(それぞれに一意の制約はありませんが、両方を含む単一の一意の制約です。たとえば、同じ親と同じ localIdentifier を持つ 2 つの行は許可されません)
alter table bar add constraint unique_bar unique (parent_id, local_identifier)
そして、それらを使用するこのコード:
//foo is persistent, foo id = 1
Bars bars = foo.getBars();
bars.clear(); // bars contained 1 item [parent_id = 1, local_identifier = "a"]
Bar newBar = new Bar();
newBar.setParent(foo);
newBar.setLocalIdentifier("a");
bars.add(newBar);
さて、何らかの理由で、Hibernate は呼び出された順序で物事を実行しません。clear()
(挿入)の前に(削除)を実行しませんが、add()
逆の場合は、最初に挿入を試みて、ConstraintViolationException
少しsession.flush()
後bars.clear();
に を追加すると、これを修正できることはわかっていますが、この場合、醜い方法でセッションにアクセスすることはできません。
それで、フラッシュが唯一の解決策ですか?または、アクションの順序を尊重する Hibernate バージョンはありますか?
更新: ところで、コレクションを逆参照すると、https://www.hibernate.org/117.html#A3から HibernateException が発生します。
I get HibernateException: Don't dereference a collection with cascade="all-delete-orphan"これは、オブジェクトを cascade="all-delete-orphan" コレクションでロードしてから、コレクションへの参照を削除すると発生します。このコレクションを置き換えないでください。孤立削除アルゴリズムが変更を検出できるように、clear() を使用してください。