JPA CascadeType.すべては削除されません孤児
質問
私は困削除する親ノードを使用JPAは以下のマッピング
@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner")
private List<Bikes> bikes;
私はこの問題の孤児役割掛けのデータベースです。
使用できるアノテーション org.hibernate.annotations.Cascade
Hibernateの特定のタグが明らかにならないようにしたい提携もに、Hibernateの実装です。
編集:そうでJPA2.0のサポートします。
解決
ご利用の場合でHibernateいについて明確に定めのアノテーション CascadeType.DELETE_ORPHAN
, できると併せてお使いいただけますJPA CascadeType.ALL
.
ない場合に使用する計画Hibernateの店舗では明示的に初の削除は、子要素を削除します主な記録の為に孤児の記録。
実行順番
- の取得主要行を削除する
- 子要素を取得す
- べて削除する子要素
- 削除メイン行
- 近いセッション
とJPA2.0利用できるオプション orphanRemoval=true
@OneToMany(mappedBy="foo", orphanRemoval=true)
他のヒント
JPA 2.0を使用している場合、 @xxxToMany
アノテーションの orphanRemoval = true
属性を使用して、孤児を削除できます。
実際には、 CascadeType.DELETE_ORPHAN
は3.5.2-Finalで非推奨になりました。
╔═════════════╦═════════════════════╦═════════════════════╗
║ Action ║ orphanRemoval=true ║ CascadeType.ALL ║
╠═════════════╬═════════════════════╬═════════════════════╣
║ delete ║ deletes parent ║ deletes parent ║
║ parent ║ and orphans ║ and orphans ║
╠═════════════╬═════════════════════╬═════════════════════╣
║ change ║ ║ ║
║ children ║ deletes orphans ║ nothing ║
║ list ║ ║ ║
╚═════════════╩═════════════════════╩═════════════════════╝
JPAをEclipseLinkで使用している場合、 @PrivateOwned アノテーションを設定する必要があります。
ドキュメント: Eclipse Wiki-EclipseLink JPA拡張機能の使用-第1.4章@PrivateOwnedアノテーションの使用方法
@PrivateOwnedを使用して孤児を削除できます 例:
@OneToMany(mappedBy = "masterData", cascade = {
CascadeType.ALL })
@PrivateOwned
private List<Data> dataList;
HibernateでのJava Persistence によると、カスケードオーファンデリートは利用できません。 JPAアノテーションとして。
JPA XMLでもサポートされていません。
この解決策を見つけましたが、私の場合は機能しません:
@OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true)
orphanRemoval = true は効果がありません。
私は同じ問題を抱えていたので、なぜこの下の条件が孤児を削除しなかったのか疑問に思いました。名前付き削除クエリを実行したときに、Hibernate(5.0.3.Final)で料理のリストが削除されませんでした:
@OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Dish> dishes = new ArrayList<>();
その後、名前付き削除クエリを使用する必要はないが、EntityManagerを使用することを思い出しました。 EntityManager.find(...)
メソッドを使用してエンティティを取得し、 EntityManager.remove(...)
を使用して削除すると、ディッシュは次のように削除されましたまあ。
Just @OneToMany(cascade = CascadeType.ALL、mappedBy =&quot; xxx&quot ;, fetch = FetchType.LAZY、orphanRemoval = true)
。
targetEntity = MyClass.class を削除します。うまく機能します。
レコードについては、JPA2より前のOpenJPAでは@ElementDependantでした。
1対1のマッピングを使用していましたが、子が削除されませんでしたJPAが外部キー違反を与えていました
orphanRemoval = trueを使用した後、問題は解決しました