2009-08-24 49 views
1

很抱歉,如果这是一个傻瓜,无法找到它,但真正地不知道该怎么寻找,反正...级联在(N)Hibernate中,我需要哪些规则?

我有三个班,ParentChildOther

Parent有很多Child哪里孩子有Parent_Id

Other通过Child_Id列保存到Child参考

当我删除Parent,我也想删除所有关联的Child对象。如果这些Child对象被任何Other类引用,我希望它们的(Other对象)Child_Id引用无效。

这两个关系需要哪些级联规则?

此外,NHibernate会更新实体内存以及数据库中的实体吗?

I.e.如果我在内存中有一堆Parent,ChildOther(即从db加载,而不是瞬态),并告诉NH删除Parent,会发生什么情况?我假设ParentChild对象会变成瞬态的?任何Other对象的Child属性会发生什么情况?

编辑:当使用All-Delete-Orphan时,什么类作为孤儿的对象?在上面的例子中,如果其父母Parent被删除,是一个孤儿Child?将实体视为孤儿时,参考Other是否重要?

感谢

回答

1

NH不更新存储您的任何实体(除ID和版本的)。 NH不负责管理您实体的关系。它只是将你在内存中所做的事情保存到数据库中。

从这个角度来看,它应该变得更容易理解。

cascade="delete"表示父母被删除时,孩子也被删除。 cascade="delete-orphan"意味着,此外,如果没有父母再次引用它,则甚至会删除该孩子。当然,这只在孩子参加会议时才有用。

被删除的实例在内存中获取瞬态。对瞬态实例的引用(来自Other)将导致异常。 AFAIK,你需要删除自己对已删除实例的引用。你可能可以通过一些技巧来隐含它,但我怀疑这将是干净的。这是商业逻辑。

对于亲子关系,cascade="all-delete-orphan"是合适的。

对于定期的参考,我更喜欢cascade="none"

有一个great explanation by Ayende Rahien

+0

感谢您的澄清。如果我有一对一的从“孩子”到“其他”我可以设置级联保存更新,这会给我我需要的功能,对吧?除了我不想要有双向关系外,我只想从“其他”到“孩子”,而不是其他方式。 – 2009-08-24 12:25:56

+0

我不会保存更新其他因为你救了孩子。假设他是一个独立的实体,它是独立于孩子创建和删除的,它不应该通过创建一个孩子而被隐式创建。对我而言,这是一种最佳做法。我不是为什么你认为这会解决你的问题。无论如何,您需要从其他人那里删除对其他孩子的引用。当然,你会发现引用Others更简单。 – 2009-08-24 12:44:12

+0

嗯不,你是对的,确定不够。那么这是否意味着我需要将所有'Other'加载到内存中,然后取消它们的'Child'引用?似乎很贵:s – 2009-08-24 13:06:33