質問
私は問題な @OneToMany
マッピングを親子団体をいう。すべての作品も、そのデータは削除された時は、削除するものと期待される。
の親会社
@Entity
public class Parent {
@Id
@Column(name = "ID")
private Long id;
@OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent")
private Set<Child> childs = new HashSet<Child>();
...
}
子:
@Entity
public class Child {
@Id
@Column(name = "ID")
private Long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="PARENTID", nullable = false)
private Parent parent;
...
}
その削除ンセのお父様(お義母様とは離婚の子供の設定は取得しませんから削除され、データベースです。たじる child.parent
参考りませんでした作品。
公開用ウェブアプリケーションの削除が起こるとして、Ajaxます。んの一覧を削除子供の場合は、保存ボタンを押すことできないの削除については、暗黙のうちに.
解決
JPA会員企業の行動が正しいという どの仕様):オブジェまではんだを除去してからOneToManyます。あるベンダー固有の拡張るものがネイティブJPAな対応です。
その一因としてはJPAなんかになるような場合は削除ものから削除されます。オブジェクトモデリング条件の違い 構成 と"集約*.
に 構成, の子実体のない存在なのです。クラシックの例はハウスやお部屋です。削除のお部屋に行く。
凝集 はゆうびに代表されるコースです。削除のコースの学生が存在する(おそらくその他。
ばなければなりませんでしのいずれかを使用ベンダー固有の拡張をこの行動について利用可能な場合)または明示的に削除し、子どもから取り出して親ることになります。
私が認識し:
- Hibernate:カスケードdelete_orphan.見 Fig.10.11.推移的な永続化;や
- EclipseLink:この"個人所有権".見 利用方法は、@PrivateOwnedン.
他のヒント
cletus'回答に加えて、 JPA 2.0 に、最終的な2010年12月以来、orphanRemoval
注釈の@OneToMany
属性を紹介します。
詳細については、こののブログエントリを参照してください。
の仕様は比較的新しいものであるので、全てではないJPA 1プロバイダは、最終的なJPA 2実装を持っていることに留意されたいです。たとえば、を休止rel="noreferrer">。
あなたはこれを試すことができます:
@OneToOne(orphanRemoval=true) or @OneToMany(orphanRemoval=true)
ます。
で説明したように、それは私がJPAでやりたいことはできませんので、私はこれで、hibernate.cascadeアノテーションを使用し、親クラス内の関連するコードは次のようになります:
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, mappedBy = "parent")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.DELETE,
org.hibernate.annotations.CascadeType.MERGE,
org.hibernate.annotations.CascadeType.PERSIST,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
private Set<Child> childs = new HashSet<Child>();
私はこのような単純な使用「ALL」を同様に親を削除しているだろうことができませんでした。
このカスケードの除去にすることで、子どもたちは削除された場合を削除します。ない。ご利用の場合は、HibernateおJPAを使用したプログラミング方法、プロバイダに行うことができるので利用 hibernateの特定のカスケード.
あなたはこれを試すことができます:
@OneToOne(cascade = CascadeType.REFRESH)
または
@OneToMany(cascade = CascadeType.REFRESH)
@Entity
class Employee {
@OneToOne(orphanRemoval=true)
private Address address;
}
ここのを参照してください。