web-dev-qa-db-ja.com

JPA CascadeType.ALLは孤児を削除しません

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

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

私は、孤立したロールがデータベースの周りにぶら下がっているという問題を抱えています。

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

EDIT:JPA 2.0はこれをサポートするようです。

130
Paul Whelan

Hibernateで使用する場合は、JPA CascadeType.DELETE_Orphanと組み合わせて使用​​できる注釈CascadeType.ALLを明示的に定義する必要があります。

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

実行シーケンス

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

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

@OneToMany(mappedBy="foo", orphanRemoval=true)
157
Varun Mehta

JPA 2.0を使用している場合は、orphanRemoval=trueアノテーションの@xxxToMany属性を使用して孤児を削除できます。

実際、CascadeType.DELETE_Orphanは3.5.2-Finalで非推奨になりました。

112
Kango_V
╔═════════════╦═════════════════════╦═════════════════════╗
║   Action    ║  orphanRemoval=true ║   CascadeType.ALL   ║
╠═════════════╬═════════════════════╬═════════════════════╣
║   delete    ║     deletes parent  ║    deletes parent   ║
║   parent    ║     and orphans     ║    and orphans      ║
╠═════════════╬═════════════════════╬═════════════════════╣
║   change    ║                     ║                     ║
║  children   ║   deletes orphans   ║      nothing        ║
║    list     ║                     ║                     ║
╚═════════════╩═════════════════════╩═════════════════════╝
43
Sergii Shevchyk

EclipseLinkでJPAを使用している場合、@ PrivateOwnedアノテーションを設定する必要があります。

ドキュメント: Eclipse Wiki-EclipseLink JPA拡張機能の使用-第1.4章@PrivateOwnedアノテーションの使用方法

@PrivateOwnedを使用して孤児を削除できます。

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

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

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

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

4

HibernateでのJava Persistence によると、cascade Orphan deleteはJPAアノテーションとして使用できません。

また、JPA XMLではサポートされていません。

4
toolkit

私は同じ問題を抱えていたので、なぜこの下の条件が孤児を削除しなかったのか疑問に思いました。名前付き削除クエリを実行したときに、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
Bevor

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

targetEntity = MyClass.classを削除すると、うまく機能します。

2
Kohan95

レコードについては、JPA2より前のOpenJPAでは@ElementDependantでした。

1
Simone Gianni

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

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

0
vipin chauhan