2010-01-27 147 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

可能是一个错误。你有没有想过提交错误报告?