次のように、クラス A からクラス B への一方向の 1 対多の関連付けがあるとします。
public class A {
@OneToMany(cascade = CascadeType.ALL)
private List<B> myBs;
}
public class B {
//I know nothing about A
}
データベースでは、これらは 3 番目のテーブルを介して接続され、ID を保持します。
ここで、A に接続されている B オブジェクトを削除したいと思います。A には独自のリポジトリ クラスがあり、B には独自のリポジトリ クラスがあります。
これが私のプロジェクトの同様の設定で行われた方法は、最初に問題の A に問題の B を削除するように依頼し、次にEnitityManager
データベースから B を削除するように指示することです。
これにより、2 つの選択肢の間で少し行き詰まります。どちらも私の考えでは最適ではありません。
のリポジトリ メソッドは
BRepository
、接続先の A からの B の削除と、 を介したデータベースからの削除の両方を処理しますEntityManager
。B のリポジトリ クラスが A オブジェクトを操作しなければならないので、私はこれが好きではありません。BRepository のリポジトリ メソッドは、EntityManager による削除のみを処理し、A のコレクションからの削除は呼び出し元に任せます。A のコレクションから B を最初に削除せずに誰かがリポジトリを呼び出すと、ひどく失敗するため、これはさらに好きではありません。
2つのうち、最初のものが断然最高だと思います。しかし、それでも、私はそれがきれいだとは本当に思いません。
Hibernate には、データベースからの削除時に、アイテムが含まれているコレクションからアイテムを削除できるようにする構造がありますか? (B を含む A も同じトランザクションにロードされているため、B を削除しようとすると失敗します。そのため、削除されたものを保存しようとすると、トランザクションの終了時に失敗します。)
( in A を追加mappedBy
する@OneToMany-mapping
と問題は解決しますか?)