Hibernate 缓存关联在创建子项时未更新

Hibernate 缓存关联在创建子项时未更新,hibernate,caching,grails,ehcache,second-level-cache,Hibernate,Caching,Grails,Ehcache,Second Level Cache,比如说,我有一个域对象 class Parent { static hasMany = [children:Child] static mapping = { cache true children cache: true // !!! } } 我有一个管理页面,显示家长和孩子的列表。 此外,还可以添加新的子对象。 当我添加启用了行(!!!)的新子项时,会发生什么?子项不会出现在父页面上。虽然它被添加到数据库中,但因为服务器重新启动使其显示。 没有线条(!!!)它可以按

比如说,我有一个域对象

class Parent {
  static hasMany = [children:Child]
  static mapping = {
   cache true
   children cache: true // !!!
  }
}
我有一个管理页面,显示家长和孩子的列表。 此外,还可以添加新的子对象。 当我添加启用了行(!!!)的新子项时,会发生什么?子项不会出现在父页面上。虽然它被添加到数据库中,但因为服务器重新启动使其显示。 没有线条(!!!)它可以按预期工作

这就是它的设计工作原理吗? 我应该手动使关联缓存无效吗? 在这个问题中也描述了类似的情况

Grails文档在这方面的信息不是很丰富


顺便说一句,我使用的是Grails2.2.1。

读写缓存模式默认设置。实际上,您不应该执行任何附加步骤来处理二级缓存。它应该对用户完全透明。魔法发生在你的代码后面。您是否在Grails配置(DataSource.groovy)中打开了二级缓存?

好的,找到了原因。似乎Hibernate就是这样设计的。这里有描述

本部分:

创建新成员并将其与组关联时会发生什么情况 缓存了谁的成员集合?如上所述,休眠 不会更新缓存中的集合,它只是将其删除。所以 我们希望这些藏品能被移除。应该是的,但是有 是应用程序开发人员需要注意的一个重要细节 其中:

集合只有在发生错误时才会从缓存中失效 表示集合的Java对象上的操作! 执行一些Java操作,从而导致 数据库,通过该数据库的新读取将该成员添加到 收集的不够

所以修复方法是注入控制器

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


孩子们是不是有些东西几乎永远不会更新?是的。它们由管理员配置,然后主要以只读方式使用,最后更新。您尝试过其他缓存设置吗<代码>读写等?是的,我使用ehcache配置了Hibernate二级缓存谢谢!这个答案节省了我很多时间!
sessionFactory.cache.evictCollectionRegions()