2

次の 2 つのエンティティを考えてみましょう。

@Entity
public class A implements Serializable {
    ...

    @OneToMany(mappedBy = "a", orphanRemoval = true)
    @Cascade(CascadeType.ALL)
    @JsonManagedReference
    private List<B> bs = new ArrayList<B>();

    ...
}

@Entity
public class B implements Serializable {
    ...

    @ManyToOne
    @JsonBackReference
    private A a;
    ...
}

A の JSON 表現を受け取り、Spring コントローラーの 1 つで @RequestBody を介してロードしています (この場合、これは既に識別子を持っている既存のエンティティです。次の問題は新しいエンティティには当てはまりません)。

ご想像のとおり、session.saveOrUpdate を呼び出しても、逆シリアル化された A.bs コレクションに含まれていない B を (データベースから) 魔法のように自動的に削除することはありませんコレクション内の個々のエンティティの更新と同様に、コレクションへの追加は機能します。

これらのオブジェクトを削除する適切な方法は何ですか? これが機能するには、リクエストを別の構造にする必要がありますか? (Spring 3.1.1 / Hibernate 4.0.1 を使用)

4

1 に答える 1

0

編集:

カスケード注釈に CascadeType.DELETE_ORPHAN を追加してみてください

@OneToMany(mappedBy = "a", orphanRemoval = true)
@Cascade(cascade = {CascadeType.ALL, CascadeType.DELETE_ORPHAN}, mappedBy = "a")
private List<B> bs = new ArrayList<B>();

ソース

于 2012-07-17T23:23:20.867 に答える