WebアプリでJPAoverHibernateを使用しています。ここに2つのエンティティがあります(ゲッターのみが表示されます):
_class Child {
private Parent parent;
@ManyToOne(optional=false)
@JoinColumn(name="parent_id", referencedColumnName="parent_id", nullable=false, updatable=false)
public Parent getParent() {
return parent;
}
}
class Parent {
private Collection<Child> children;
@OneToMany(fetch=FetchType.EAGER, mappedBy="parent", cascade={CascadeType.ALL})
public Collection<Child> getChildren() {
return children;
}
}
_
ご覧のとおり、Parent
とChild
は「1対多」として関連付けられています。
次に、Parent
インスタンスをロードし、一部またはすべての子を削除して、変更を保存する必要があります。以下は私にとっては機能しないコードです:
_Parent p = entityManager.find(Parent.class, 12345L); // load entity
p.getChildren().clear(); // remove all children
entityManager.merge(p); // try to save
_
上記の例では、子エンティティは削除されません。次に、子ごとに手動でentityManager.remove()
を呼び出す必要があります。
子コレクションを管理する簡単な方法はありますか?
Hibernate固有の機能は使用せず、純粋なJPAのみを使用することに注意してください。
JPA 2.0の場合、次のように設定できます orphanRemoval=true
の@OneToMany
JPA 1.0の場合、Hibernate固有のアノテーションを使用する必要があります。それは@Cascade
アノテーション(cascade
属性の代わりに)、値は
@Cascade({CascadeType.ALL, CascadeType.DELETE_Orphan})
Hibernate3.5 +はJPA2.0を実装します