私は1.0.3から1.3.7へのGrailsアプリケーションをアップグレードしようと例外に走っています:Grailsの - 保存されていない一時的なインスタンス例外
object references an unsaved transient instance - save the transient instance before flushing:
私はいたしておりませんがトリガーコードに保存されます。私はcacheNFLを取り出して、それが本当のたびにフェッチ間に合わせる場合
public static Affiliation getNfl() {
if (cacheNFL == null) {
String key = ConfigurationHolder.config.nfl
cacheNFL = Affiliation.findByKey(key)
}
return cacheNFL;
}
は、コードが動作します。これは、次のコードAffiliation.nflへの呼び出しがある
public static Season getCurrentSeason() {
String yearString = ConfigurationHolder.config.year
assert yearString != null: "need to configure season"
int year = Integer.parseInt(yearString)
Affiliation nfl = Affiliation.nfl;
return Season.findBySeasonKeyAndLeague(year, nfl)
}
です。私の質問は次のとおりです:
- なぜこれまでに機能しましたか?現在の Hibernateクエリの一部ではないキャッシュ オブジェクトでフェッチを作成するように思われます(これは私がおそらく であると仮定しています)。 はサポートされません。
- とは別にこの問題の周りに が存在しますか?私は データベースを押すか、休止状態 キャッシュに行きます場合 が、私は(私は休止状態 について多くを知らない)伝えることができますどのよう
- 。 私に見せることができる出力はありますか?
ありがとう:
は、GrailsのSQLロギングを有効にします。あなたの最初と2番目の点であなたが何を意味しているのか本当に分かりません。だから、キャッシュされたAffiliationオブジェクトを渡すと、それがフラッシュされ、本質的にセーブを呼び出しますか?あなたのポイントをもっと詳しく説明できますか?手伝ってくれてどうもありがとう。 – skaz
1.これはキャッシュされたエンティティではなく、 'flush()'を引き起こすキャッシュ初期化( 'Affiliation.findByKey()')です。 'flush()'は、 'save()'のように、変更をデータベースに書き出します。コミットされていないものだけです。あなたが 'discard()'したり、実際には何もsave()しないと自動的にロールバックされます。 (ここではHibernateの内部について間違っているかもしれませんが、それは考えです) –
2.現在のHibernateセッションを 'flush()'しないようにするにはhttp://www.coderanch.com/t/218534/ORM/java/ commit-flush-Hibernateの違い)、別の 'Session'でコードを実行することができます - これは' .withNewSession {} 'と同じです。しかし、別のセッションのオブジェクトを保存/接続することはできません。あなたが 'attach()'(http://grails.org/doc/latest/ref/Domain%20Classes/attach.html)するまであなたの現在のセッションに –