说,我有域对象
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。
答案 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()