Grails Hibernate 过滤器 findById(id) 与 get(id)

Grails Hibernate Filter findById(id) vs. get(id)

我正在使用休眠过滤器根据登录信息过滤我的域类。

它按预期工作
<DomainClass>.findById(<id>)

但它不适用于

<DomainClass>.get(<id>).

为什么过滤器不用于使用 get 获取第二个版本?

好吧,几年前我找到了这个问题的具体 explanation made by Burt

get()(和 read(),它使用 get() 并将实例设置为只读)是唯一始终使用二级缓存的方法。 load() 也会,但它没有映射到 GORM 中。所有其他方法都是支持使用查询缓存(与 get() 使用的实例缓存分开)的标准查询或 HQL 查询的变体,但默认情况下不使用它。

这很容易测试。打开基本 sql 登录 DataSource.groovy:

dataSource {
   pooled = true
   driverClassName = ...
   ...
   loggingSql = true
}

并创建一个简单的缓存 class:

class Thing {
      String name
      static mapping = {
         cache true
      }
   }

运行 grails console 并创建实例:

def thing = new Thing(name: 'foo').save()

然后使用 findById() 加载它,注意每次重复调用都会生成 SQL:

println Thing.findById(1L).name

并使用 get() 加载它并注意只有第一次调用生成 SQL 并且重复调用不会:

println Thing.get(1L).name

然后您可以再次调用 findById(),即使该实例已被缓存,它仍然每次都会访问数据库。"

在我的例子中,它完全像这样工作。