18

私には2つのクラスAとBがあります。多くのBは単一のAと関連付けることができるため、BからAへの多対1の関係です。次のように関係をマッピングしました。

<class name="A" table="tbl_A">
  <property name="propA" column="colA"/>
</class>
<class name="B" table="tbl_B">
  <property name="propB" column="colB"/>
  <many-to-one name="a" class="A" column="col1" cascade="delete"/>
</class>

AにはBにマップされたものはありません。これを念頭に置いて、関連付けられているAが削除されたときにBを削除する予定です。これは、Bの多対1の関連付けでinverse = "true"を定義できれば可能でしたが、Hibernateではそれが許可されていません。

誰かがこれを手伝うことができますか?このためにAには何も書きたくありません。

4

2 に答える 2

24

休止状態は、定義された関連付けに沿ってのみカスケードされます。AがBについて何も知らない場合、Aで何もしないとBに影響しません。

したがって、Pascalの提案は、必要なことを実行するための最も簡単な方法です。

<class name="A" table="tbl_A">
  ...
  <set name="myBs" inverse="true" cascade="all,delete-orphan">
    <key column="col1"/>
    <one-to-many class="B"/>
  </set>
</class>

<class name="B" table="tbl_B">
  ...
  <many-to-one name="a" class="A" column="col1" not-null="true"/>
</class>

cascade="delete"元のコードで設定したままに設定しても、希望どおりの結果が得られないことに注意してBください。Hibernateに「Bが削除された場合はAを削除する」ように指示します。これにより、制約違反が発生する可能性があります(そのAにリンクされている他のBがある場合)。 )。

BのコレクションをAに追加できない場合(そのような状況は実際には考えられませんが)、他の唯一の方法は、外部キーレベルでAからBへのカスケード削除を定義することです。Aが削除されると、Bも削除されます。

ただし、これはかなり醜い解決策です。HibernateでAを削除する方法に細心の注意を払う必要があるためです。

  1. Aを削除する前にセッションをフラッシュする必要があります(Bの更新が保留されていると、エラーが発生するか、Aと一部のBがバックグラウンドで再挿入される可能性があります)
  2. AにリンクされているすべてのB(および、A側からの関係を維持していないため、すべてのBを意味します)は、すべてのアクティブなセッションと第2レベルのキャッシュから削除する必要があります。
于 2009-11-11T17:25:03.203 に答える
7

cascade="all,delete-orphan"関連付けを使用して A から B に移動する必要があると思いますone-to-many

于 2009-11-11T14:29:46.130 に答える