1

说,我有域对象

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

我有管理页面,显示父级和子级列表。还有一个添加新孩子的能力。发生在我身上的是当我添加启用行 (!!!) 的新孩子时 - 孩子不会出现在父页面上。虽然它已添加到数据库中,但由于服务器重新启动使其显示。没有线 (!!!) 它按预期工作。

这是它应该如何设计的吗?我应该手动使关联缓存无效吗?这个问题缓存设置中也描述了类似的东西

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

顺便提一句。我正在使用 Grails 2.2.1。

4

2 回答 2

2

好的,找到原因了。似乎 Hibernate 是按照这种方式设计的。它在这里描述http://planet.jboss.org/post/collection_caching_in_the_hibernate_second_level_cache

这部分:

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

仅当对代表集合的 Java 对象进行操作时,集合才会从缓存中失效!执行一些 Java 操作会导致数据库发生变化,从而重新读取数据库会将成员添加到集合中是不够的。

所以解决方法是注入 Controller

def sessionFactory

并在 save() 方法中手动使集合缓存无效

sessionFactory.cache.evictCollectionRegions()
于 2013-09-09T18:26:18.617 回答
1

read-write缓存模式默认设置。实际上,您不应该采取任何额外的步骤来使用二级缓存。它应该对用户完全透明。魔法发生在你的代码后面。您是否在 Grails 配置 (DataSource.groovy) 中打开了 L2 缓存?

于 2013-09-06T20:47:52.923 回答