3

次のドメイン クラスがレガシー テーブルにマッピングされ、読み取り専用の第 2 レベル キャッシュを利用し、一時的なフィールドがあるとします。

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

 Long id
 Long userId

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

問題があります。DomainObject への参照が第 1 レベルのキャッシュのために共有されているため、一時的なフィールドが互いに上書きされています。例えば、

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

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

assert r1.userId == 34

つまり、r1 と r2 は同じインスタンスへの参照です。これは望ましくありません。参照を共有せずにテーブル データをキャッシュしたいと考えています。何か案は?

[編集]

状況をよりよく理解した今、私の質問は次のように要約できると思います: 特定のドメイン クラスの第 1 レベル キャッシュを無効にしながら、第 2 レベル キャッシュを引き続き使用する方法はありますか?

[編集]

この目標を達成する明確な方法がないように思われるため、代わりにその必要性を中心に再設計することにしました。

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 セッションを取得できます。第 1 レベルのキャッシュを維持するのは Hibernate セッションです。

于 2010-05-19T19:49:14.087 に答える
0

DomainObject.get(1) の代わりに DomainObject.findById(1) を使用できます。「get」メソッドはクエリ結果をキャッシュしますが、前者はキャッシュしません。

于 2010-05-24T06:07:13.707 に答える