4

イメージを参照する「モノ」がなくなったときに、Hibernate にイメージを自動的に削除させるには、どのような種類のカスケード タイプを使用できますか? (基本的に、Hibernateでのガベージコレクションのようなものです)

データベース: Thing テーブル - 画像テーブルは多対 1 であるため、多くの Thing が同じ画像を参照できます。

エンティティ: モノ、イメージ

多対一なので、例えば5つのものが1つの画像に関連しています。

今、私は:

public void delete(Thing thing)
{
    if (countReferences(thing.getImage()) > 1)
    {
        thing.setImage(null);
    }
    getSession().delete(thing);
}

countReferences を行わず、関係に CascaseType.REMOVE がある場合、Hibernate は Image も削除しようとします。イメージがまだどこかで参照されている場合、データベース内の制約が発生し、例外が発生します。

要するに、それを参照している最後のものが削除されたときに、休止状態にそのイメージを削除するように指示するにはどうすればよいですか?

です

org.hibernate.event.PreDeleteEventListener

おそらく解決策?

4

1 に答える 1

3

Hibernate Docs を調べたところ、そのような機能はサポートされていないようです。サポートされていない理由は理解できたと思いますが。

参照では、コレクション内のエンティティは、コレクションを含むエンティティによって所有one-to-manyされていると見なされます( 24.1. コレクションに関する注意を参照)。

それとは対照的に、many-to-one参照にはそのような意味はありません。参照されたエンティティは、当然のことながら、参照エンティティによって所有されていません。したがって、 へのすべての参照Imageが削除されたとしても、それも削除する必要があると考える理由はありませんImageImageは、完全に独立した第 1 級エンティティです。

したがって、あなたの場合、適用的に削除を強制することから逃れることはできないようです。

于 2011-12-01T13:04:03.213 に答える