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

时间:2015-08-13 12:32:45

标签: grails grails-plugin

我正在使用hibernate Filter根据登录过滤我的域类。

正如预期的那样

<DomainClass>.findById(<id>)

但它不适用于

<DomainClass>.get(<id>).

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

1 个答案:

答案 0 :(得分:1)

好吧,我在几年前找到了explanation针对这个问题制作的具体Burt

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

这很容易测试。在DataSource.groovy中启用基本的sql日志记录:

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

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

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(),每次都会点击数据库,即使该实例被缓存了。&#34;

就我而言,它的工作方式与此类似。