Hibernate 3.6 でのカスケード削除に問題があります。Menu と Item という 2 つのエンティティ クラスの間に多対多の関係があります。これは一方向の関係であることに注意してください。Menu インスタンスには、それが持つアイテムのセットへの参照があります。しかし、Item インスタンスは、それが属する Menu インスタンスについて知りません。
@Entity
public class Menu {
@Id
private Long id;
@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(
name = "Menu_Item",
joinColumns = {@JoinColumn(name = "menu_id")}
inverseJoinColumns = {@JoinColumn(name = "item_id")},
)
private Set<Item> items = new HashSet<Item>();
....
}
@Entity
public class Item {
@Id
private Long id;
private String name;
private String code;
...
}
私の要件:テーブルの行は、Item
少なくとも 1 つのMenu
エントリが参照している場合にのみ、データベースに存在する必要があります。つまり、どのメニューにも属さない項目はデータベースに存在してはなりません。
ここで、次のシナリオを想定します。
menu1 には [item1, item2] があります
menu2 には [item1] があります
を呼び出すsession.remove(menu1)
と、Hibernate は と の両方item1
をテーブルitem2
から削除しようとしItem
ます (この操作は実際にはデータセットによって拒否されます)。item2
を使用する別のメニューがあるため、Hibernate に のみを削除してもらいたいitem1
。
cascade
not include にすることで、メニューが削除されたときに関連するアイテムが削除されるのを防ぐことができることを認識していますCascadeType.DELETE
。しかし、私はこの動作も望んでいません。item2
データベースから削除したいのです (メニューがそれを使用していないため、つまり、Menu_Item テーブルに関連付けがないため)。
Hibernateでこれを達成するのに最適なものは何ですか?