140

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

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

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

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

編集:JPA2.0にはこれのサポートが含まれるようです。

4

11 に答える 11

168

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

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

実行順序

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

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

@OneToMany(mappedBy="foo", orphanRemoval=true)
于 2008-11-20T22:54:33.773 に答える
113

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

実際、CascadeType.DELETE_ORPHAN3.5.2-Final で非推奨になりました。

于 2010-05-28T11:18:37.447 に答える
12

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

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

于 2009-09-01T12:01:22.787 に答える
7

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

@OneToMany(mappedBy = "masterData", cascade = {
        CascadeType.ALL })
@PrivateOwned
private List<Data> dataList;
于 2011-07-08T11:03:04.710 に答える
6

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

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

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

于 2010-10-06T12:07:30.093 に答える
4

Java Persistence with Hibernateによると、カスケード孤立削除はJPAアノテーションとして使用できません。

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

于 2008-11-20T17:38:10.947 に答える
2

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

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

于 2010-12-11T12:08:25.450 に答える
1

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

于 2011-05-18T16:35:15.903 に答える
0

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

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

于 2016-01-13T06:27:17.520 に答える