Hibernate 刷新页面时grails中奇怪的GORM行为(F5)

Hibernate 刷新页面时grails中奇怪的GORM行为(F5),hibernate,grails,gorm,Hibernate,Grails,Gorm,我有一个实体(作者)和一个呈现所有作者的控制器操作 def index = { def list = Author.list() render(view: 'index', model: ['allauthors' : list]) } 呈现页面时,将按预期执行单个查询: Hibernate: select this_.id as id0_0_, this_.version as version0_0_, this_.name as name0_0

我有一个实体(作者)和一个呈现所有作者的控制器操作

def index = {
    def list = Author.list()
    render(view: 'index', model: ['allauthors' : list])
}
呈现页面时,将按预期执行单个查询:

Hibernate: 
  select
    this_.id as id0_0_,
    this_.version as version0_0_,
    this_.name as name0_0_
  from
    author this_
但是,当我按Refresh(F5)时,会为每个作者执行select语句(这里我有3个作者):


为什么会发生这种情况?

看起来这与查询缓存有关。如果你有

cache.use_query_cache = true
在Datasource.groovy中,但没有在域类中设置缓存,缓存似乎正在逐出每个
list()
上的所有条目,并且必须重新缓存每个条目(只是猜测)

如果将缓存添加到域中,则多个选择将消失-事实上,在添加以下内容后刷新时不会执行任何选择:

static mapping = {
    cache true
}

这可能是因为默认情况下关闭了第二级缓存。如果您经常看到刷新功能,可以通过在list()调用中传递cache参数来缓存列表查询。奇怪的是,为什么语句:Author.book()第一次执行普通的单个select语句,但在刷新时,它会为每个作者执行多个select语句!有什么想法吗?我添加了hibernate标记,因为我觉得这可以在hibernate级别而不是Grails级别得到更好的解释。我刚刚用Grails 1.3.7和默认数据源、脚手架控制器和视图测试了这一点,并且每次调用index action都只执行一个select语句,无论刷新多少次。什么版本的grails?您的数据源和作者是什么样子的?我建议您在def list=Author.list()前后添加一些“logging语句”,可能还有另一个语句触发了这个问题
static mapping = {
    cache true
}