4

当没有更多“事物”引用它时,我可以使用哪种级联类型以及在哪里让 Hibernate 自动删除图像?(基本上是在 Hibernate 中进行垃圾收集)

数据库:Thing table - Image 表,是多对一的,所以很多Things可以引用同一张图片。

实体:事物、图像

它是多对一的,因此例如 5 件事与一个图像有关。

现在,我这样做:

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删除了所有对的引用,也没有理由认为Image也应该删除它。Image是一个完全独立的一级实体。

因此,在您的情况下,似乎无法避免应用强制删除。

于 2011-12-01T13:04:03.213 回答