gpt4 book ai didi

Java、Hibernate、CascadeTypes 和 'garbage collecting' 孤儿

转载 作者:搜寻专家 更新时间:2023-11-01 03:11:51 27 4
gpt4 key购买 nike

我可以使用哪种级联类型以及在何处让 Hibernate 在不再有“事物”引用图像时自动删除该图像? (基本上就是 Hibernate 中的垃圾收集)

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

实体:事物、图像

它是多对一的,所以例如 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

也许是一个解决方案?

最佳答案

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

一对多引用中,集合中的实体被认为由包含该集合的实体拥有(参见24.1. A note about collections)。

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

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

关于Java、Hibernate、CascadeTypes 和 'garbage collecting' 孤儿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8339320/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com