2014-06-18 48 views
0

在Grails中無法從頭開始創建對象(在代碼中而不是從表單中)。以下是控制器(評估)中方法的代碼片段。Grails在保存時出錯:無法在只讀事務中執行nextval()

def newVol = new Vol(
       volType:type, 
       app: assessmentInstance.app, 
       assessment:assessmentInstance, 
       dateFound: assessmentInstance.assDate, 
       urlParam: url, 
       volName: "TEST", 
       volNote: "TEST" 
     ) 

     newVol.save(validate:false,flush:true, failOnError:true) 

結果是這樣的錯誤:

Class 
org.postgresql.util.PSQLException 
Message 
ERROR: cannot execute nextval() in a read-only transaction 

的ID被映射到卷類發電機:

static mapping = { 
    id column:'vol_id' 

    id generator: 'sequence',params:[sequence:'scan_sequence'] 
} 

我真的不知道如何保存可以被認爲作爲只讀事務處理。我嘗試在我的域類上使用@transactional設置,首先將readOnly設置爲false,然後刪除@transactional,但它沒有改變任何事情。看起來我應該尋找使用數據庫序列的替代方案。你怎麼看?

UPDATE 從上面的代碼所在的控制器中刪除了readonly = true,並且該代碼在其中工作。但是......除去這些的副作用是什麼?

回答

2

問題是你爲什麼要在只讀事務中執行寫操作?如果您正在進行寫操作,那麼刪除readOnly=true絕對是正確的做法。

如果你只是執行一個讀取,然後你不應該刪除它。原因在於具有readOnly=true可以提高性能,因爲Hibernate不需要對只讀事務執行髒檢查。

+0

謝謝。答案是在腳手架過程中默認添加了readOnly = true。 – mcgyver5

相關問題