web-dev-qa-db-ja.com

JPA + Hibernate + Spring + OneToMany削除カスケード

関連する質問をいくつか読みましたが、それらは私の質問とまったく同じ問題ではありません。

私はJPA + Hibernate + Springを使用していますが、configだけで可能かどうかわからないことをしたいと思っています。

多かれ少なかれ複雑な関係を持つドメインクラスがあります。 1つの要素に関連する要素は多数あります(ツリーである場合、多くの要素は1つの要素の息子です)。

何かのようなもの:

@Entity
class Foo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    private Foo parentNode;
    ...
}

次のようなテーブルを取得します:

Foo id    parent_id
1
2         1 
3         1

Id = 1の行を削除するとき、id = 2およびid = 3の行を削除します(再帰的な場合があり、parent_id = 2およびparent_id = 3の要素も削除されます)。

いくつかの制限については、parent_id参照との関係は息子の側にしかできません。

私の質問は、JPAまたはHibernate構成でこれを行うことは可能ですか、またはすべての子とすべての親を削除するために再帰関数を実行する必要がありますか?

私が試した:

@OneToMany(name = "PARENT_ID", cascade = CascadeType.REMOVE)

そして、おそらくHibernateアノテーションを使用して読んだことがあります。

誰かが私にいくつかの手がかりを与えることができるなら、私はこの時点で失われます。

編集1

次のようにすることは可能ですか?

@Entity
class Foo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    @JoinColumn(name="PARENT_ID")
    private Foo parentNode;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "parentNode", cascade = CascadeType.REMOVE, orphanRemoval = true)
    private Set<Foo> childs = new LinkedHashSet<Foo>();
    ...
}

親へのfkを使用して、テーブルをそのまま保持しますか?私はこれを試しましたが、fkの制限に違反して、同じエラーが引き続き発生します。

編集2

最終的に解決されました:

@Entity
class Foo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    private Foo parentNode;

    @OneToMany(mappedBy = "parentNode", cascade = CascadeType.REMOVE)
    private Set<Foo> childs = new LinkedHashSet<Foo>();
    ...
}

この @OneToManyは、親IDのみを参照してBBDDでマッピングを行う場合でも必要です。

子を持つFooを削除すると、子も削除されます。

お時間をいただきありがとうございます!

21
Garci García

JPAの関係は、両方向で親を子に関連付ける場合を除き、常に単方向です。親から子へのカスケードREMOVE操作では、親から子へのリレーションが必要になります(逆ではありません)。

そのため、ここでは単方向の関係を双方向に変更する必要があります。

詳細については このリンク。 を参照してください。

24
Harshal Patil

orphanRemoval オプションを見てください:

@OneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true)

完全な説明 about CascadeType.REMOVEおよびorphanRemoval

がんばろう!

20
jmvivo