在
的二级缓存说明中它表示:如果使用cascade =“all”或cascade =“all-delete-orphan”映射关联,NHibernate将自动逐出相关实体。
为什么我希望nhibernate在有级联时驱逐缓存的关联?
这是否意味着我必须更改关联映射以使nhibernate二级实际工作?
答案 0 :(得分:1)
以这种方式工作是件好事。缓存很棒,但必须在安全方面犯错,以防止无效的缓存数据。
考虑带有标题和订单项的发票的概念。标头设置为级联所有插入/更新/删除到行项目。因此,如果删除标题,则也会删除订单项。这是有道理的,因为它构成一个“聚合实体”,标题是聚合根。这些订单项本身没有真正的标识。如果您保存新标题,则还希望保存任何添加的订单项。级联非常棒,因为它可以为您处理。
同样从缓存的角度来看,如果更改了标头并因此从缓存中刷新,则应刷新所有行项目,因为级联可能会影响其中的一个或多个。如果要从数据库重新加载聚合根,则还应重新加载它的子项。
基本上,如果聚合根已更改,则无法保证缓存中子项的状态,因此您必须预期它们也可能已更改。
我还应该补充一点,你应该仔细考虑你想要缓存的内容。如果您正在缓存经历不断变化的实体,它可能对您没有好处。通常情况下,您要缓存相对静态的内容,因此级联并不是什么大问题。