2011-06-20 30 views
2

我試圖從1.0.3一個Grails應用程序升級到1.3.7,衝進例外:Grails的 - 未保存的瞬態的實例例外

object references an unsaved transient instance - save the transient instance before flushing: 

我沒有做在觸發代碼的任何撲救。這是在下面的代碼

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) 
    } 

到Affiliation.nfl電話是:

public static Affiliation getNfl() { 
      if (cacheNFL == null) { 
      String key = ConfigurationHolder.config.nfl 
      cacheNFL = Affiliation.findByKey(key) 
     } 
     return cacheNFL; 
    } 

如果我刪除了cacheNFL,使之做一個真正的每次取,代碼工作。我的問題是:

  • 這是爲什麼之前工作?看起來像 喜歡使用緩存 對象,而不是當前的 休眠查詢(我可能是 錯誤地假設是問題) 永遠不會受支持的一部分。
  • 是否有 無論如何圍繞這個問題,除了 取數據庫?
  • 如何 我可以告訴我打到 數據庫或去休眠 緩存(我不太瞭解 休眠)。有輸出可以 告訴我嗎?

回答

6
  1. findBy*觸發一個flush() - 每Criteria刷新都可以通過Criteria潛在地返回的任何對象。 這樣做是爲了確保Criteria返回所有匹配的對象。 看起來這個邏輯是在1.1中引入的。

  2. 嘗試獲取Affiliation.withNewSession{ }中的對象。或者,更好的是,在開始當前交易之前/在交易開始前,在對象變髒之前取回。

  3. 啓用Grails的SQL日誌:How to log sql in grails 1.3.7

+1

感謝您的輸入。我不太清楚你的第一和第二點是什麼意思 - 我對此很新。所以當我傳入緩存的Affiliation對象時,它會刷新它,從而基本上調用save?你能詳細說明你的觀點嗎?非常感謝你的幫助。 – skaz

+0

1.它不是一個緩存的實體,而是緩存ititialization(你的'Affiliation.findByKey()'),它會導致'flush()'。 'flush()',是的,就像'save()'一樣,將更改寫入數據庫。只有它沒有提交 - 它會自動回滾,如果你放棄()它或者實際上沒有保存任何東西。 (我在這裏可能是錯誤的關於Hibernate內部的,但它是這個想法) –

+0

2.爲了不flush()當前的Hibernate會話(http://www.coderanch.com/t/218534/ORM/java/在不同的提交刷新Hibernate之間),你可以在一個不同的Session中運行一個代碼 - 這就是'.withNewSession {}'所做的。儘管如此,您將無法保存/連接不同會話中的對象,直到您將attach()'(http://grails.org/doc/latest/ref/Domain%20Classes/attach.html)到您當前的會話。 –

相關問題