2011-06-20 12 views
2

私は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クエリの一部ではないキャッシュ オブジェクトでフェッチを作成するように思われます(これは私がおそらく であると仮定しています)。 はサポートされません。
  • とは別にこの問題の周りに が存在しますか?私は データベースを押すか、休止状態 キャッシュに行きます場合 が、私は(私は休止状態 について多くを知らない)伝えることができますどのよう
  • 。 私に見せることができる出力はありますか?

答えて

6
  1. それはflush()をトリガーfindBy*だ - すべてのCriteriaは潜在的にそのCriteriaで返すことができる任意のオブジェクトをフラッシュします。 これは、Criteriaがすべての一致するオブジェクトを確実に返すようにするために行われます。 このロジックは1.1で導入されたようです。

  2. Affiliation.withNewSession{ }でオブジェクトを取得してみてください。または、トランザクションの開始時に、現在のトランザクションを開始する前に、flush() edオブジェクトが汚染される前に、それを取り出してください。あなたの入力のためのHow to log sql in grails 1.3.7

+1

ありがとう:

  • は、GrailsのSQLロギングを有効にします。あなたの最初と2番目の点であなたが何を意味しているのか本当に分かりません。だから、キャッシュされたAffiliationオブジェクトを渡すと、それがフラッシュされ、本質的にセーブを呼び出しますか?あなたのポイントをもっと詳しく説明できますか?手伝ってくれてどうもありがとう。 – skaz

  • +0

    1.これはキャッシュされたエンティティではなく、 'flush()'を引き起こすキャッシュ初期化( 'Affiliation.findByKey()')です。 'flush()'は、 'save()'のように、変更をデータベースに書き出します。コミットされていないものだけです。あなたが 'discard()'したり、実際には何もsave()しないと自動的にロールバックされます。 (ここではHibernateの内部について間違っているかもしれませんが、それは考えです) –

    +0

    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)するまであなたの現在のセッションに –

    関連する問題