JPA CascadeType.ALLが孤立を削除しない


132

次のマッピングでJPAを使用して孤立ノードを削除するのに問題があります

@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner")
private List<Bikes> bikes;

孤立したロールがデータベースにぶら下がっている問題があります。

注釈org.hibernate.annotations.CascadeHibernate固有のタグを使用できますが、明らかにソリューションをHibernate実装に結び付けたくありません。

編集:JPA 2.0はこれに対するサポートを含むようです。

回答:


164

Hibernateで使用する場合はCascadeType.DELETE_ORPHAN、JPAと組み合わせて使用​​できるアノテーションを明示的に定義する必要がありますCascadeType.ALL

Hibernateを使用する予定がない場合は、最初に子要素を明示的に削除してから、メインレコードを削除して、孤立したレコードを回避する必要があります。

実行シーケンス

  1. 削除するメイン行をフェッチします
  2. 子要素を取得する
  3. すべての子要素を削除する
  4. メイン行を削除
  5. セッションを閉じる

JPA 2.0では、オプションorphanRemoval = trueを使用できるようになりました

@OneToMany(mappedBy="foo", orphanRemoval=true)

3
結局、このルートにたどり着いたおかげで、これはJPA仕様の少し見落としだと思います。
Paul Whelan、

13
JPA 2.0標準では、@ OneToManyの属性としてdeleteOrphanが追加されました。最新の休止状態を使用している場合は、@ OneToMany(...、deleteOrphan = true)を実行できます
jomohke

子要素を更新するときの実行シーケンスとは何ですか?孤立レコードは削除されますか?
jAckOdE 2014年

113

JPA 2.0を使用している場合orphanRemoval=trueは、@xxxToManyアノテーションの属性を使用して孤立を削除できるようになりました。

実際、CascadeType.DELETE_ORPHAN3.5.2-Finalで非推奨になっています。


6
実際、私はorphanRemoval = trueが別の意味を持っていると思います。つまり、オブジェクトを親のコレクションから削除するときに、オブジェクトを削除します。download.oracle.com/javaee/6/tutorial/doc/bnbqa.html#giqxy
Archie

Archieのリンクにアクセスしてください。
Jigar Shah

4
orphanRemoval = trueも機能しません。古い方法で行う必要があります。
ジョーアルモア2013年

45
╔═════════════╦═════════════════════╦═════════════════════╗
   Action      orphanRemoval=true    CascadeType.ALL   
╠═════════════╬═════════════════════╬═════════════════════╣
   delete         deletes parent      deletes parent   
   parent         and orphans         and orphans      
╠═════════════╬═════════════════════╬═════════════════════╣
   change                                              
  children      deletes orphans         nothing        
    list                                               
╚═════════════╩═════════════════════╩═════════════════════╝

1
cascade = CascadeType.ALL, orphanRemoval = false親がいて削除するとどうなりますか?私は特にしないように言ったとしても、それは子供を削除しますか?
izogfif 2018年


7

@PrivateOwnedを使用して、孤立したユーザーを削除できます。

@OneToMany(mappedBy = "masterData", cascade = {
        CascadeType.ALL })
@PrivateOwned
private List<Data> dataList;

5
@reshmaに感謝します。@ PrivateOwnedはeclipselink JPA拡張です。
ポールウィラン、2011

5

私はこの解決策を見つけましたが、私の場合はうまくいきません:

@OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true) 

orphanRemoval = trueは効果がありません。


1
変更が有効になる前に、クリーンアップしてビルドする必要がありました。
maralbjo

うわー、ManyToOneにCascadeType.ALLを追加しても削除がカスケードされなかった理由を1時間探していました。クリーンアップおよびビルドされ、動作します。@maralbjoに感謝します。
Andrew Mairose 2015年


2

私は同じ問題を抱えていましたが、以下のこの条件で孤児が削除されなかったのはなぜだろうと思いました。名前付き削除クエリを実行したときに、Hibernate(5.0.3.Final)で料理のリストが削除されませんでした。

@OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Dish> dishes = new ArrayList<>();

次に、名前付き削除クエリではなくEntityManagerを使用する必要があることを思い出しました。EntityManager.find(...)メソッドを使用してエンティティをフェッチしてEntityManager.remove(...)から削除すると、料理も削除されました。


2

ただ@OneToMany(cascade = CascadeType.ALL, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true)

targetEntity = MyClass.classを削除してください



0

1対1のマッピングを使用していましたが、子が削除されませんでしたJPAが外部キー違反を与えていました

orphanRemoval = trueを使用した後、問題は解決しました


@OneToOne(cascade = CascadeType.ALL、orphanRemoval = true)@JoinColumn(name = "CHILD_OID")private子の子。
vipin chauhan 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.