web-dev-qa-db-ja.com

JPAを使用してコレクションから子を削除する

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;
  }
}
_

ご覧のとおり、ParentChildは「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のみを使用することに注意してください。

21
Andrey

JPA 2.0の場合、次のように設定できます orphanRemoval=true@OneToMany

JPA 1.0の場合、Hibernate固有のアノテーションを使用する必要があります。それは@Cascadeアノテーション(cascade属性の代わりに)、値は

@Cascade({CascadeType.ALL, CascadeType.DELETE_Orphan})

Hibernate3.5 +はJPA2.0を実装します

28
Bozho