3

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

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 是对同一实例的引用。这是不可取的,我想缓存表数据而不共享引用。有任何想法吗?

[编辑]

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

[编辑]

由于似乎没有明确的方法来获得此目标,因此我们选择围绕对它的需求进行重新设计。

4

3 回答 3

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
于 2010-05-18T20:27:06.083 回答
0

我想你可以,在 BootStrap 中,一个新的 get() 方法(或任何其他名称的方法)上的元类可以做同样的事情 - 调用原始的 get() 并丢弃该对象。

您的使用场景是什么要求不共享瞬态字段?您总是可以为每个使用位置获得一个新的 Hibernate 会话。Hibernate 会话负责维护一级缓存。

于 2010-05-19T19:49:14.087 回答
0

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

于 2010-05-24T06:07:13.707 回答