Nhibernate二级缓存不用于级联关联



在上的二级缓存解释中

http://knol.google.com/k/nhibernate-chapter-16-improving-performance#16(2E)3(2E)(C2)(A0)管理_通道

它说:如果关联是用cascade="all"或cascade="all-delete-overn"映射的,NHibernate将自动驱逐关联实体。

当存在级联时,我为什么要nhibernate驱逐缓存的关联?

这是否意味着我必须更改关联映射才能使nhibernate第二级真正工作?

这样工作是件好事。缓存很好,但为了安全起见,它必须出错,以尽可能防止缓存的数据无效。

想象一下有标题和行项目的发票的概念。标题设置为将所有插入/更新/删除级联到行项目。因此,如果删除标题,行项目也会被删除。这是有意义的,因为这构成了一个"聚合实体",其标头是聚合根。这些行项目本身并没有真正的身份。如果保存新标题,则希望同时保存任何添加的行项目。级联非常棒,因为它可以为您处理此问题。

同样,从缓存的角度来看,如果头被更改并因此从缓存中刷新,那么所有行项目也应该被刷新,因为级联可能影响了其中的一个或多个。如果您正在从DB重新加载聚合根,那么也应该重新加载它的子级。

基本上,如果聚合根发生了更改,则无法保证缓存中子项的状态,因此您必须预计它们也可能发生了更改。

我还应该补充一点,你应该仔细考虑你想要缓存的内容。如果您正在缓存不断更改的实体,则这可能对您没有好处。通常情况下,您将缓存相对静态的东西,因此级联不是什么大不了的事情。

最新更新