有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java、Hibernate、CascadeTypes和“垃圾收集”孤儿

我可以使用什么样的级联类型,在没有其他“东西”指向图像时,在哪里让Hibernate自动删除图像?(基本上是在冬眠时收集垃圾)

数据库:事物表-图像表,是一个多对一的表,所以许多事物可以引用同一个图像

实体:事物、形象

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

现在,我有:

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

如果我不做countReferences的事情,就会有一个CascaseType。删除关系时,Hibernate也会尝试删除映像。数据库中的约束在图像仍被引用到某个位置时激发,从而导致异常

那么,简而言之,当最后一个引用它的东西被删除时,我如何告诉hibernate删除它呢

是一个

org.hibernate.event.PreDeleteEventListener

也许是一个解决办法


共 (1) 个答案

  1. # 1 楼答案

    在深入研究Hibernate文档之后,似乎不支持这样的功能。虽然我想我理解为什么它不被支持

    one-to-many引用中,集合中的实体被认为是由包含集合的实体所拥有的(参见24.1. A note about collections

    与此相反,一个many-to-one引用没有这样的含义。被引用实体合理地不属于被引用实体。因此,即使删除了对Image的所有引用,也没有理由认为Image也应该删除Image是一个完全独立的一级实体

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