Grails / GORM,禁用一级缓存

时间:2010-05-18 17:04:11

标签: hibernate grails gorm ehcache

假设我有以下Domain类映射到旧表,使用只读二级缓存并具有瞬态字段:

class DomainObject {
 static def transients = ['userId']

 Long id
 Long userId

 static mapping = {
  cache usage: 'read-only'
  table 'SOME_TABLE'
 }
}

我遇到问题,由于第一级缓存而正在共享对DomainObject的引用,因此瞬态字段相互重写。例如,

def r1 = DomainObject.get(1)
r1.userId = 22

def r2 = DomainObject.get(1)
r2.userId = 34

assert r1.userId == 34

即,r1和r2是对同一实例的引用。这是不可取的,我想缓存表数据而不共享引用。有什么想法吗?

[编辑]

现在更好地了解情况,我相信我的问题可以归结为以下内容:是否仍然在使用二级缓存时禁用特定域类的第一级缓存?

[编辑]

由于似乎没有干净的方法来实现这一目标,我们选择重新设计它的需求。

3 个答案:

答案 0 :(得分:2)

请忽略我之前的回答,我完全不了解您的问题。

但是,以下内容将起作用(代码测试):

def r1 = DomainObject.get(1)
r1.userId = 22
r1.discard() //BE CAREFUL WITH THIS, YOU MIGHT END UP WITH a LazyInitializationException

def r2 = DomainObject.get(1)
r2.userId = 34

assert r1.userId == 22

答案 1 :(得分:0)

我想你可以在BootStrap中使用新的get()方法(或任何其他名称的方法)的metaclass来执行相同的操作 - 调用原始的get()并丢弃该对象。

您的使用方案是什么,需要暂时不允许共享字段?您总是可以为每个使用位置获得一个新的Hibernate会话。 Hibernate会话维护了第一级缓存。

答案 2 :(得分:0)

您可以使用DomainObject.findById(1)代替DomainObject.get(1)。由于“get”方法缓存是查询结果,但前者不是。