在创建子项时,不会更新缓存关联

时间:2013-09-06 15:35:20

标签: hibernate caching grails ehcache second-level-cache

说,我有域对象

class Parent {
  static hasMany = [children:Child]
  static mapping = {
   cache true
   children cache: true // !!!
  }
}

我有管理页面,显示包含子项列表的Parent。 还有一个能够添加新孩子的能力。 我发生的事情是当我添加新的子线路(!!!)时,子线路不会出现在父页面上。虽然它被添加到DB中,因为服务器重启使它显示出来。 没有行(!!!)它按预期工作。

它是如何通过设计工作的? 我应该手动使关联缓存无效吗? 此问题cache setting in grails

中也描述了类似的内容

Grails文档对此http://grails.org/doc/latest/guide/GORM.html#caching的信息量不大。

顺便说一下。我正在使用Grails 2.2.1。

2 个答案:

答案 0 :(得分:1)

默认情况下设置

read-write缓存模式。实际上,您不应该使用二级缓存进行任何其他步骤。它应该对用户完全透明。魔术发生在你的代码背后。您是否在Grails配置(DataSource.groovy)中启用了L2缓存?

答案 1 :(得分:0)

好的,找到了原因。似乎Hibernate通过设计以这种方式工作。这里描述了http://planet.jboss.org/post/collection_caching_in_the_hibernate_second_level_cache

这部分:

  

创建新成员并与组关联时会发生什么   其成员集合是否已缓存?正如我上面所说,Hibernate   不更新缓存中的集合,它只是删除它。所以,   我们希望删除该集合。它应该是,但在那里   是应用程序开发人员需要注意的一个重要的微妙之处   的:

     

集合仅作为结果从缓存中失效   对表示集合的Java对象的操作!   执行一些导致更改的Java操作   数据库的新读取将添加成员的数据库   收集还不够。

所以修复是注入Controller

def sessionFactory

并在save()方法

中手动使集合缓存无效
sessionFactory.cache.evictCollectionRegions()