質問

私は困削除する親ノードを使用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の店舗では明示的に初の削除は、子要素を削除します主な記録の為に孤児の記録。

実行順番

  1. の取得主要行を削除する
  2. 子要素を取得す
  3. べて削除する子要素
  4. 削除メイン行
  5. 近いセッション

と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を使用した後、問題は解決しました

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top