2010-01-27 323 views
-1

在我的Grails應用程序我有,有一個屬性域類Grails的限制數據庫列大小

SearchPrivacy searchPrivacy = SearchPrivacy.PUBLIC 

其中SearchPrivacy是根據Grails的文檔枚舉

enum SearchPrivacy { 
    PRIVATE('pr'), PUBLIC('pu'); 

    final String id 

    SearchPrivacy(String id) { 
     this.id = id 
    } 

    static getEnumFromId(String id) { 
     values().find {it.id == id} 
    } 
} 

,對應的數據庫列將存儲prpu - id屬性的值。但是,似乎沒有辦法減少數據庫列的最大長度。我嘗試添加以下兩個

static constrtaints = { 
    searchPrivacy(size: 2..2, maxSize: 2) 
} 

但在生成的模式的列仍然是varchar(255)

謝謝, 唐

+0

@唐,你解決了你的問題嗎? – Bozho 2010-02-23 20:50:58

回答

1

我不知道如何轉換到Grails的,但在Java中,將使用屬性上的@Column(length=2)註釋完成。

+0

「在Java中」你的意思是「在休眠」? – 2010-01-27 21:47:30

+0

是的,hibernate被標記了,所以我沒有澄清:) – Bozho 2010-01-27 21:49:41

0

你的約束只限制你可以堅持的東西。

如果您想要修改持久化的實際SQL類型,您需要在您的域類中聲明一個名爲'mapping'的靜態屬性 - 就像您已經在爲約束所做的那樣。它會是這個樣子:

static mapping = { 
    searchPrivacy type: SearchPrivacy, { 
    sqlType: "char(2)" 
    } 
} 

你應該永遠是當你看到自己使用則sqlType屬性,因爲你可能會失去對數據庫的獨立性從休眠得到望風。 (請記住,並非所有數據庫都支持相同的類型。)

您還可以使用'映射'屬性來處理自定義列名稱,組合鍵和ID生成策略。

我希望這有助於!

+0

這是不正確的,「約束只限制你可以堅持」。如果您查看Grails文檔中的約束條件,其中很多人會說「這個約束影響到模式生成」 – 2010-01-27 22:58:37

+0

我在舊文檔中看到過這種情況。我會刪除它。 映射屬性是否解決了您的問題? – Brandon 2010-01-28 11:27:42

+0

@唐:它隻影響如果你創建一個新的數據庫。對於舊的數據庫,它不會執行任何操作並使用舊的列定義。這就是Hibernate的工作原理。不過我不確定布蘭登的sqlType映射。 – 2013-08-02 06:51:36

0

可能是一個錯誤。你有沒有想過提交錯誤報告?