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 楼答案
在深入研究Hibernate文档之后,似乎不支持这样的功能。虽然我想我理解为什么它不被支持
在
one-to-many
引用中,集合中的实体被认为是由包含集合的实体所拥有的(参见24.1. A note about collections)与此相反,一个
many-to-one
引用没有这样的含义。被引用实体合理地不属于被引用实体。因此,即使删除了对Image
的所有引用,也没有理由认为Image
也应该删除Image
是一个完全独立的一级实体因此,在您的情况下,似乎无法避免应用程序强制删除