2014-02-28 85 views
0

我有一個Grails域類,它是SQL Server上的相關數據庫表。我想添加一個新的屬性/列jPId類型的整數到現有的域/表。這裏是我的代碼有:Grails:無法將整數屬性添加到域類

class JobCode{ 

    int jPId // This is the new property/column I want to add. 

    //Other Properties which already have corresponding columns in DB 

    static mapping = { 
     jPId defaultValue: 0 
    } 

    static constraints = { 
     jPId nullable:true // tried commenting this line as well 
     //Other properties 
    } 
} 

我的DataSource配置文件有DB模式設置爲「更新」,這樣,我可以將執行任何ALTER操作。現在,當我重新啓動服務器時,我期望它在數據庫中創建新的整數/數字列。但它會拋出下面的錯誤,並不能創建列:

ERRORorg.hibernate.tool.hbm2ddl.SchemaUpdateUnsuccessful: alter table EF_JobCode add jpid int not null 
ERRORorg.hibernate.tool.hbm2ddl.SchemaUpdateALTER TABLE only allows columns to be added that can contain nulls, or have a DEFAULT definition specified, or the column being added is an identity or timestamp column, or alternatively if none of the previous conditions are satisfied the table must be empty to allow addition of this column. Column 'jpid' cannot be added to non-empty table 'EF_JobCode' because it does not satisfy these conditions. 

我很無知,因爲我不知道我錯過了什麼!我在上面的代碼中給了int jPId一個默認值,並且也將它聲明爲nullable:true(也對它進行了評論,因爲我不確定nullable:true是否適用於基本類型)。沒有任何工作,我不斷看到上述錯誤。

+1

您可以在映射中指定想要的實際列名並嘗試嗎? 'jPId列:「JP_ID」,defaultValue:0'?或者你想要的名稱不是「JP_ID」。 – dmahapatro

+0

我只是嘗試了列,但徒勞無功。令人討厭的是,Grails試圖使用命令「alter table EF_JobPremium add jpid int not null」來改變表格......儘管我提到了可空:true。 – rajugaadu

+0

這是一個休眠的東西 - 它保護你自己 - 看到我的回答 –

回答

3

可空對象在Hibernate/GORM中沒有意義。如果數據庫中存在空值,則零在Groovy/Java中不是合適的值,因爲根據您的業務規則,零是有效值並且通常與空值非常不同。同樣對於布爾值/布爾值 - false與null不同。總是指定數字和布爾值的對象類型以允許數據庫空值爲Groovy/Java空值。另外,不要使用dbCreate='update'。添加列時,無論您在約束中指定了什麼,它們都將添加爲空,並且必須修復先前的行才能生成有效值並將列更改爲非空。此外,可能看起來合理的許多變化將不會完成。一個例子是列擴大。儘管這不會導致數據丟失,但Hibernate不會這樣做。它也不會添加索引,還有其他相關問題。使用create-drop直到您厭倦了每次重新啓動時丟失數據並切換到數據庫遷移(例如, http://grails.org/plugin/database-migration

+0

我想我應該同意我寧願選擇包裝類類型而不是原語。但是,我仍然不清楚爲什麼當我給它一個默認值時它不能接受一個int類型的屬性。在我的情況下,0是一個很好的默認值,我希望它能夠與原始int一起工作,因爲在應用程序中有一些其他實例,其中一些屬性在創建丟棄狀態期間創建爲'double'或'boolean'。 – rajugaadu

+0

關於dbCreate ='update',我們正處於發佈的中間,我沒有那種奢侈來選擇與我們團隊決定的不同。但是,您可以更多地瞭解爲什麼創建更好比更新更好?當我們處理測試數據時,我們不希望在每次重新啓動服務器時清理,重建和重新載入數據。 – rajugaadu

+1

有沒有簡單的解決方案。 'create-drop'會刪除所有內容,但是您始終保持同步,並且您可以將數據填充到BootStrap中(儘管對於大數據來說這是不切實際的)。您還可以根據需要保留已知良好的導出和重新導入。 'update'太怯懦,並且出乎意料的事情,所以我完全避免它。遷移可能需要很多工作,但我認爲一旦你習慣了這個過程,那就不是那麼糟糕了。歸結爲爲工作流程選擇最不好的選項:) –