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,使之做一個真正的每次取,代碼工作。我的問題是:
- 這是爲什麼之前工作?看起來像 喜歡使用緩存 對象,而不是當前的 休眠查詢(我可能是 錯誤地假設是問題) 永遠不會受支持的一部分。
- 是否有 無論如何圍繞這個問題,除了 取數據庫?
- 如何 我可以告訴我打到 數據庫或去休眠 緩存(我不太瞭解 休眠)。有輸出可以 告訴我嗎?
感謝您的輸入。我不太清楚你的第一和第二點是什麼意思 - 我對此很新。所以當我傳入緩存的Affiliation對象時,它會刷新它,從而基本上調用save?你能詳細說明你的觀點嗎?非常感謝你的幫助。 – skaz
1.它不是一個緩存的實體,而是緩存ititialization(你的'Affiliation.findByKey()'),它會導致'flush()'。 'flush()',是的,就像'save()'一樣,將更改寫入數據庫。只有它沒有提交 - 它會自動回滾,如果你放棄()它或者實際上沒有保存任何東西。 (我在這裏可能是錯誤的關於Hibernate內部的,但它是這個想法) –
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)到您當前的會話。 –