2008-12-11 60 views
5

可以说我有两张表 - “孩子”和“父母”之间有多对一的关系。我需要的是删除父记录时删除子条目。Hibernate:如何在删除父项时使Hibernate从子表中删除记录如果子项与多对一的父项链接?

如果我通过在parent.hbm中创建一对多关联并设置cascade =“all-delete-orphan”从父项链接子表,这不是问题。

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

child.hbm:

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

而parent.hbm有孩子没有关联。

现在的问题是:如何让Hibernate从子表中删除记录时删除父项,如果一个子项与多对一的父项链接?

谢谢。

+0

为什么不在你的家长中使用懒惰的一对多,而只是使用级联选项?当你使用父母时,你不会加载孩子。 – gcores 2008-12-11 16:52:13

+2

这就是我的想法,但恐怕会给结构带来混乱。我将需要添加“设置儿童”字段到父类,不应该在代码中的任何地方使用,只用于休眠级联删除。你认为这样可以吗? – serg 2008-12-11 16:56:19

回答

5

两个选择:

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

  • 使用Hibernate Interceptor(或AOP环境中的某个方面)来检测父记录删除并删除子项。

我个人倾向于第一种选择,因为它可以让你的数据模型更密切地反映在您的数据的真正关系。

编辑:有第三种选择,但它不愉快 - 使用数据库触发器,并刷新您的Hibernate缓存(或使用非缓存会话)。