我正在使用hibernate Filter根据登录过滤我的域类。
正如预期的那样
<DomainClass>.findById(<id>)
但它不适用于
<DomainClass>.get(<id>).
为什么过滤器不用于获取第二个版本的get?
答案 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;
就我而言,它的工作方式与此类似。