3つのEntitiesオブジェクトクラスがあるとします。
class Parent {
String name;
List<Child> children;
}
class Child {
String name;
Parent parent;
}
class Toy {
String name;
Child child;
}
JPA2.x(またはhibernate)アノテーションを使用して、次のことを行うにはどうすればよいですか。
Hibernate 4.3.5とmysql 5.1.30を使用しています。
ありがとう
この記事 で説明されているように、remove
エンティティの状態遷移 は、親から子にカスケードする必要があり、その逆ではありません。
あなたはこのようなものが必要です:
class Parent {
String name;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
List<Child> children;
public void addChild(Child child) {
child.setParent(this);
children.add(child);
}
public void removeChild(Child child) {
children.remove(child);
if (child != null) {
child.setParent(null);
}
}
}
class Child {
String name;
@ManyToOne
Parent parent;
@OneToOne(mappedBy = "child", cascade = CascadeType.ALL, orphanRemoval = true)
Toy toy;
}
class Toy {
String name;
@OneToOne
Child child;
}
CascadeType.REMOVE
を使用してください。これは、HibernateとJPAの両方に共通のアノテーションです。 Hibernateには、CascadeType.DELETE
のような別の類似のタイプCacadeType
があります。
親が削除するときにすべての子を自動的に削除する(1対多)
class Parent {
String name;
@OneToMany(cascade = CascadeType.REMOVE)
List<Child> children;
}
削除時に子リストから子を自動的に削除します(1対多)
class Child {
String name;
@ManyToOne(cascade = CascadeType.REMOVE)
Parent parent;
}
子供が削除するとおもちゃを自動的に削除する(1対1)
class Toy {
String name;
@OneToOne(cascade = CascadeType.REMOVE)
Child child;
}
orphanRemoval is all delete Orphan entity example:store(s)has books(b1、b2、b3)and b1 has this title(t)この場合、ストアを削除すると、books(b2、b3)がいくつか削除されます。 B2とtはまだ存在しています。 「cascade= CascadeType.Remove
"ストアのみで、すべての書籍が削除されます(" t "のみが存在します)。
s->b1,b2,b3 b2->t ------after(orphanRemoval = true)--------- b2->t
s->b1,b2,b3 b2->t ------ after(cascade=CascadeType.REMOVE)--------- t
OrphanRemoval = trueが指定されている場合、切断されたエンティティインスタンスは自動的に削除されます。これは、所有者オブジェクトからの参照なしでは存在してはならない依存オブジェクトをクリーンアップするのに役立ちます。
cascade=CascadeType.REMOVE
が指定されている場合、関係の切断は削除操作ではないため、自動アクションは実行されません。