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

Nhibernate二级缓存不用于级联关联?,nhibernate,caching,Nhibernate,Caching,在上的第二级缓存解释中 它表示:如果关联映射为cascade=“all”或cascade=“all delete orphan”,则NHibernate将自动逐出关联的实体 当存在级联时,为什么我要nhibernate逐出缓存的关联 这是否意味着我必须更改关联映射以使nhibernate第二级实际工作?这样工作是件好事。缓存很好,但它必须在安全方面出错,以尽可能防止无效的缓存数据 想象一下带有标题和行项目的发票的概念。标题设置为将所有插入/更新/删除级联到行项目。因此,如果删除标题,行项目也将

在上的第二级缓存解释中

它表示:如果关联映射为cascade=“all”或cascade=“all delete orphan”,则NHibernate将自动逐出关联的实体

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


这是否意味着我必须更改关联映射以使nhibernate第二级实际工作?

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

想象一下带有标题和行项目的发票的概念。标题设置为将所有插入/更新/删除级联到行项目。因此,如果删除标题,行项目也将被删除。这是有意义的,因为它构成了一个“聚合实体”,头是聚合根。这些行项目本身没有真正的标识。如果保存新标题,则还需要保存任何添加的行项目。级联非常好,因为它可以为您处理这一点

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

基本上,如果聚合根已更改,则无法保证缓存中的子项的状态,因此必须预期它们也已更改


我还要补充一点,您应该仔细考虑要缓存的内容。如果您正在缓存不断变化的实体,可能对您没有好处。通常,您将缓存相对静态的内容,因此级联不是什么大问题。

好的,这是可以理解的。然而,在我们的场景中,当应用程序未更改根聚合时,关联似乎从二级缓存中刷新。没有足够的信息给您提供答案。你凭什么相信他们被驱逐了?你确定它们被缓存了吗?您是否尝试过Nhprof来查看实际发生的情况?您也可以发布您的映射吗?当我们在相关映射文件中将读写更改为只读时,结果发现在加载根聚合后,其中一个关联在代码中被重新排序,包括分配给关联项的属性。这会导致nh更新这些项目,也是将这些项目从缓存中清除的原因。。。