Grails / GORM, отключить кэш первого уровня - PullRequest
3 голосов
/ 18 мая 2010

Предположим, у меня есть следующее сопоставление классов Домена с устаревшей таблицей, использующее кэш второго уровня только для чтения и имеющее переходное поле:

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 ]

2 голосов
/ 19 мая 2010

Пожалуйста, игнорируйте мой предыдущий ответ, я не полностью понял вашу проблему.

Однако будет работать следующее (проверено кодом):

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
0 голосов
/ 24 мая 2010

Вы можете использовать DomainObject.findById (1) вместо DomainObject.get (1). Поскольку кеш метода get является результатом запроса, а первый - нет.

0 голосов
/ 19 мая 2010

Я полагаю, что вы могли бы в BootStrap создать метакласс нового метода get () (или метода с любым другим именем), который мог бы сделать то же самое - вызвать оригинальный метод get () и отбросить объект.

Какой сценарий использования требует, чтобы временные поля не были доступны для совместного использования? Вы всегда можете получить новый сеанс Hibernate для каждого места использования. Сеанс Hibernate поддерживает кеш первого уровня.

...