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

时间:2012-02-23 18:59:30

标签: nhibernate caching

的二级缓存说明中

http://knol.google.com/k/nhibernate-chapter-16-improving-performance#16(2E)3(2E)(C2)(A0)Managing_the_caches

它表示:如果使用cascade =“all”或cascade =“all-delete-orphan”映射关联,NHibernate将自动逐出相关实体。

为什么我希望nhibernate在有级联时驱逐缓存的关联?

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

1 个答案:

答案 0 :(得分:1)

以这种方式工作是件好事。缓存很棒,但必须在安全方面犯错,以防止无效的缓存数据。

考虑带有标题和订单项的发票的概念。标头设置为级联所有插入/更新/删除到行项目。因此,如果删除标题,则也会删除订单项。这是有道理的,因为它构成一个“聚合实体”,标题是聚合根。这些订单项本身没有真正的标识。如果您保存新标题,则还希望保存任何添加的订单项。级联非常棒,因为它可以为您处理。

同样从缓存的角度来看,如果更改了标头并因此从缓存中刷新,则应刷新所有行项目,因为级联可能会影响其中的一个或多个。如果要从数据库重新加载聚合根,则还应重新加载它的子项。

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

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