1. ホーム
  2. java

[解決済み] JPA OneToManyで子が削除されない

2022-04-21 02:19:43

質問

単純な @OneToMany 親エンティティと子エンティティの間のマッピング。すべてうまくいきますが、子レコードをコレクションから削除したときに、子レコードが削除されません。

親は

@Entity
public class Parent {
    @Id
    @Column(name = "ID")
    private Long id;

    @OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent")
    private Set<Child> childs = new HashSet<Child>();

 ...
}

子です。

@Entity
public class Child {
    @Id
    @Column(name = "ID")
    private Long id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="PARENTID", nullable = false)
    private Parent parent;

  ...
}

今子供セットから子供を削除すると、データベースから削除されません。を無効にすることを試みました。 child.parent を参照していますが、これもうまくいきません。

エンティティはWebアプリケーションで使用され、削除はAjaxリクエストの一部として発生します。保存ボタンが押されたときに削除された子のリストを持っていないので、暗黙的に削除することはできません。

解決方法は?

JPAの動作は正しい(意味 仕様書通り オブジェクトは、OneToManyコレクションから削除されただけでは削除されません。OneToManyコレクションからオブジェクトを削除しても、オブジェクトは削除されません。

これは、JPAが、コレクションから削除されたものを削除すべきかどうか、実際にはわからないからです。オブジェクトモデリング用語では、これは 構成 と"aggregation*があります。

構成 親がいなければ子実体は存在しない。典型的な例は、家と部屋の間です。ハウスを削除すると、ルームも削除されます。

集計 は、より緩やかな種類の関連付けであり、コースと学生に代表される。コースを削除しても、学生は (おそらく他のコースに) まだ存在します。

そのため、ベンダー固有の拡張機能を使用してこの動作を強制するか (可能な場合)、明示的に子を削除し、親のコレクションから削除する必要があります。

私が認識しているのは