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()
,即使该实例已被缓存,它仍然每次都会访问数据库。"
在我的例子中,它完全像这样工作。
我正在使用休眠过滤器根据登录信息过滤我的域类。
它按预期工作<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()
,即使该实例已被缓存,它仍然每次都会访问数据库。"
在我的例子中,它完全像这样工作。