次のマッピングでJPAを使用して孤立ノードを削除するのに問題があります
@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner")
private List<Bikes> bikes;
私は、孤立したロールがデータベースの周りにぶら下がっているという問題を抱えています。
注釈org.hibernate.annotations.Cascade
Hibernate固有のタグを使用できますが、明らかにソリューションをHibernate実装に結び付けたくないのです。
EDIT:JPA 2.0はこれをサポートするようです。
Hibernateで使用する場合は、JPA CascadeType.DELETE_Orphan
と組み合わせて使用できる注釈CascadeType.ALL
を明示的に定義する必要があります。
Hibernateを使用する予定がない場合は、最初に子要素を明示的に削除してから、メインレコードを削除して、孤立レコードを回避する必要があります。
実行シーケンス
JPA 2.0では、オプションorphanRemoval = trueを使用できるようになりました
@OneToMany(mappedBy="foo", orphanRemoval=true)
JPA 2.0を使用している場合は、orphanRemoval=true
アノテーションの@xxxToMany
属性を使用して孤児を削除できます。
実際、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 ║ ║ ║
╚═════════════╩═════════════════════╩═════════════════════╝
EclipseLinkでJPAを使用している場合、@ PrivateOwnedアノテーションを設定する必要があります。
ドキュメント: Eclipse Wiki-EclipseLink JPA拡張機能の使用-第1.4章@PrivateOwnedアノテーションの使用方法
@PrivateOwnedを使用して孤児を削除できます。
@OneToMany(mappedBy = "masterData", cascade = {
CascadeType.ALL })
@PrivateOwned
private List<Data> dataList;
私はこの解決策を見つけましたが、私の場合はうまくいきません:
@OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true)
orphanRemoval = trueは効果がありません。
HibernateでのJava Persistence によると、cascade Orphan deleteはJPAアノテーションとして使用できません。
また、JPA XMLではサポートされていません。
私は同じ問題を抱えていたので、なぜこの下の条件が孤児を削除しなかったのか疑問に思いました。名前付き削除クエリを実行したときに、Hibernate(5.0.3.Final)で料理のリストが削除されませんでした。
@OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Dish> dishes = new ArrayList<>();
そして、私は名前付き削除クエリを使用してはならないであるが、EntityManagerであることを思い出しました。 EntityManager.find(...)
メソッドを使用してエンティティを取得し、EntityManager.remove(...)
を使用して削除したため、ディッシュも削除されました。
ただ@OneToMany(cascade = CascadeType.ALL, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true)
。
targetEntity = MyClass.classを削除すると、うまく機能します。
レコードについては、JPA2より前のOpenJPAでは@ElementDependantでした。
私は1対1のマッピングを使用していましたが、子供が削除されていませんJPAが外部キー違反を与えていました
OrphanRemoval = trueを使用した後、問題は解決しました