Java Hibernate:如果子对象以多对一的方式链接到父对象,那么在删除父对象时如何使Hibernate从子表中删除记录?

Java Hibernate:如果子对象以多对一的方式链接到父对象,那么在删除父对象时如何使Hibernate从子表中删除记录?,java,mysql,database,hibernate,cascade,Java,Mysql,Database,Hibernate,Cascade,假设我有两个表——“child”和“parent”具有多对一关系。如果父记录被删除,我需要删除子条目 如果我通过在parent.hbm中创建一对多关联并设置cascade=“all delete orphan”将子表与父表链接起来,这并没有问题 问题是我不希望父端有一对多关系,所以我在子端创建了多对一。原因是子表非常大,我不想每次使用父表时提取数百条记录。 因此,我的配置如下所示: child.hbm: <many-to-one name="parent" class="com.examp

假设我有两个表——“child”和“parent”具有多对一关系。如果父记录被删除,我需要删除子条目

如果我通过在parent.hbm中创建一对多关联并设置cascade=“all delete orphan”将子表与父表链接起来,这并没有问题

问题是我不希望父端有一对多关系,所以我在子端创建了多对一。原因是子表非常大,我不想每次使用父表时提取数百条记录。 因此,我的配置如下所示:

child.hbm:

<many-to-one name="parent" class="com.example.Parent" column="parentid"/>

而parent.hbm与child没有关联

问题是:如果子对象链接到具有多对一的父对象,那么在删除父对象时,如何使Hibernate从子表中删除记录?

谢谢。

两个选项:

  • 使用级联删除将一对多添加到父级,但使用延迟加载减轻性能损失

  • 使用(或AOP环境中的方面)检测父记录删除和子记录删除

就个人而言,我倾向于第一种选择,因为它可以让您的数据模型更紧密地反映数据中的真实关系


编辑:还有第三个选项,但这并不令人愉快-使用数据库触发器,刷新Hibernate缓存(或使用非缓存会话)。

为什么不在父级中使用一对多的延迟方式,只使用级联选项呢?当你使用家长时,你不会加载孩子。这就是我的想法,但我担心这会给结构带来混乱。我需要将“Set children”字段添加到父类中,该字段不应在代码中的任何地方使用,仅用于hibernate级联删除。你认为可以吗?是的,这是一种逻辑关系。毕竟父子关系确实存在。如果不想公开setter,请将其设置为私有。好的,如果没有其他选项,我将使用该设置。谢谢。顺便说一句,它似乎不允许私人二传。哦,好吧……在读了你的触发选项之后,我几乎被迫去DV!我很高兴你没有把它作为一个真正的解决方案。有没有关于通过Hibernate实现这一点的更新?有人知道这在某个时候是否能得到支持吗?