休眠仅沿着定义的关联进行级联。如果A对B不了解,那么您对A所做的任何事情都不会影响B。
因此,Pascal的建议是您要做的最简单的方法:
<class name="A" table="tbl_A"> ... <set name="myBs" inverse="true" cascade="all,delete-orphan"> <key column="col1"/> <one-to-many /> </set></class><class name="B" table="tbl_B"> ... <many-to-one name="a" column="col1" not-null="true"/></class>
请注意,在原始代码中
cascade="delete"按
B原样打开将不会执行您想要的操作-
它告诉Hibernate“如果删除了B则删除A”,这很可能会导致约束冲突(如果还有其他B链接到该A )。
如果您绝对不能向A添加B的集合(尽管我真的不认为会是这种情况),那么您唯一的另一种选择是在外键级别上定义从A到B的级联删除。当您删除A时,您的B将被删除。
但是,这是一个非常丑陋的解决方案,因为您必须非常小心如何在Hibernate中删除A:
- 必须先刷新会话,然后才能删除A(对B的待定更新可能会导致错误,或者A和某些B在后台重新插入)
- 链接到您的A的所有B(并且由于您未从A端维护关系,这意味着 所有 B)必须从所有活动会话和2级缓存中逐出。



