2015-12-16 29 views
0

我在項目中添加了一個新的域類,當調用該方法向表中添加一個新實例時,拋出一個奇怪的錯誤。Grails/Hibernate:字段「版本」沒有默認值


這是呼叫:(一個簡單的保存,如果沒有打印錯誤)

if (!distributor.save()) { 
    flash.error = message(code: 'unexpectedError') 
    distributor.errors.each { 
     println it 
    } 
} 

這是堆棧跟蹤:(僅引起部分)

Caused by: java.sql.SQLException: Field 'version' doesn't have a default value 

有人得到這個錯誤嗎?我不明白爲什麼會發生這種情況,因爲version是Grails/Hibernate框架自動生成的字段。

我試圖刪除表並重新創建它,但仍然收到相同的錯誤。 這可能是一個錯誤?我不認爲我做錯了,因爲這不是我在項目中的第一張桌子或關係。

任何幫助將不勝感激。

回答

2

我發現了一個並不是最有效但解決了我的問題的解決方案。

這看起來像一個Grails/Hibernate bug,有時會在添加域類時發生,或者在項目已經運行時修改它或它們的關係。


在這種question他們問了同樣的錯誤,但同場id。我試過這個solution和工作:

  1. 刪除有問題的表格。
  2. 備份數據庫。
  3. 刪除數據庫
  4. 從備份
  5. 運行該項目重新創建數據庫的問題

步驟1,如果你已經有了一個備份不需要2創建表。


這個解決方案的問題是,如果你的數據庫很大,那麼問題就來了。主要需要大約20-30分鐘做備份或從備份重新創建數據庫。

+1

今天我有同樣的問題,因爲你有。它只發生在聯合測試中,而不是在項目中。奇 – Tiina

1

如果你不需要一個版本使用

static mapping = { 
     version false 
} 

,如果你確實需要它,嘗試

static mapping = { 
     version true 
} 

你可以設置一個默認值,這樣

static mapping = { 
     PROPERTY_NAME defaultValue: DESIRED_VALUE 
} 
+1

該字段版本由hibernate創建並用於處理該行是否被另一個事務更新或刪除。在我所有的其他表(域類)中,我不處理任何版本,並始終正常工作。 **我想知道的是爲什麼現在拋出一個錯誤。**因爲不推薦這個字段被程序員修改,所以Grails/Hibernate是負責的。 – IgniteCoders

+0

如果您使用遷移,您將在誰創建什麼和什麼時候有領先優勢,並且您將看到版本是通過藍色還是通過gorm創建的。我遇到過。整體版本會影響你的樂觀鎖定機制,但它仍然會以任何方式工作,但有一些性能缺陷。 – shaydel

+0

感謝您的回答。我終於得出的結論是,如果要修改域類或它們之間的關係的東西,之前停止應用程序做它,不要把時間花在試圖解決 造成應用程序不可解釋的錯誤重新編譯 – IgniteCoders

相關問題