【问题标题】:Java, Hibernate, CascadeTypes and 'garbage collecting' OrphansJava、Hibernate、CascadeTypes 和“垃圾收集”孤儿
【发布时间】:2011-12-01 09:51:43
【问题描述】:

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

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

实体:事物、图像

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

现在,我愿意:

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

如果我不做 countReferences 事情,并且关系上有 CascaseType.REMOVE,Hibernate 也会尝试删除 Image。当仍然在某处引用图像时,数据库中的约束会触发,从而导致异常。

那么,简而言之,当最后一个引用它的事物被删除时,我如何告诉 hibernate 删除图像?

是一个

org.hibernate.event.PreDeleteEventListener

也许是一个解决方案?

【问题讨论】:

  • @OneToMany(orphanRemoval=true) 不适合你吗?
  • 是否可以选择使用 delete-orphan 从 Image 到 Thing 进行一对多?
  • 对不起,我的错 - 没有仔细阅读。因此,仅当没有 Things(多方)引用它并且您想在删除最后一个引用 ImageThing 时删除它,您才想删除 Image(一侧)?

标签: java hibernate orm entity-relationship garbage


【解决方案1】:

深入研究 Hibernate Docs 后,似乎不支持这样的功能。虽然我想我明白为什么不支持它。

one-to-many 引用中,集合中的实体被视为由包含该集合的实体拥有(请参阅24.1. A note about collections)。

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

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

【讨论】:

    猜你喜欢
    • 2011-10-19
    • 2010-12-13
    • 1970-01-01
    • 2011-01-06
    • 2020-11-29
    • 1970-01-01
    • 2013-08-09
    • 2011-11-07
    • 1970-01-01
    相关资源
    最近更新 更多