将grails / groovy枚举映射到Mysql枚举

时间:2016-11-10 10:59:34

标签: mysql grails enums gorm

这是我的环境

Grails Version: 3.1.6
Groovy Version: 2.4.6
JVM Version: 1.8.0_51

build.gradle中的hibernate版本

compile "org.hibernate:hibernate-core:5.1.1.Final"
compile "org.hibernate:hibernate-ehcache:5.1.1.Final"

我希望将枚举映射到MySql,如下所示:

| Field       | Type                | Null | Key | Default | Extra         |
| logtype     | enum('DEBUG','INFO'| NO   |     | NULL    |                |

但我没有得到它。我搜索了一些建议,但我没有让它们正常工作。

这是我的代码:

 package xxxx

class Template {

    enum LogType {
        DEBUG("DEBUG"), INFO("INFO")
        String name
        LogType(name){
            this.name = name
        }
    }

    Integer tplID
    LogType lt

    static constraints = {
        tplID(nullable: true)
        lt(nullable: true)
    }


    static mapping = {
        table "Template"
        id name: "tplID"
        tplID column: "tplID", comment: "ID"
        lt sqlType: "enum", column: "lt", enumType: "DEBUG"
    }
}

我在这里阅读了文档 http://docs.grails.org/3.1.1/ref/Database%20Mapping/column.html

我不确定enumType的用法是否正确,任何人都可以使用吗?

更新后,以下代码仍无效

class Template {

    enum LogType {
        DEBUG("DEBUG"), INFO("INFO")
        String name

        LogType(name) {
            this.name = name
        }
    }

    LogType lt

    static constraints = {
    }

    static mapping = {
        table "Template"
        lt sqlType: "enum", enumType: 'string'
    }
}

1 个答案:

答案 0 :(得分:2)

首先提出您的问题 - 您已在文档中解释过:

  

enumType(可选) - 类型安全的枚举属性的枚举类型。无论是序数还是弦乐。 link

这意味着你可以使用:

  • enumType: 'ordinal'将使用序数数字存储枚举
  

注意:序号是其枚举声明中的位置,其中初始常量的序数为零。 link

  • enumType: 'string'将枚举及其枚举名称

...

我在你的代码中注意到的其他问题:

  • 您无需为枚举LogType创建自己的名称属性,枚举已经有一个,等于声明名称。

  • 如果表/列名与类/字段名相同,则无需显式定义它们。

  • 您的表使用可空ID

编辑:

所以这是您编辑的代码,我的评论可以改进/删除

class Template {

    //no need to define own name field, remove own implementation
    enum LogType {
        DEBUG("DEBUG"), INFO("INFO")
        String name 

        LogType(name) {
            this.name = name
        }
    }

    LogType lt

    static constraints = {
    }

    static mapping = {
        table "Template" //name can be infered from domain class name
        lt sqlType: "enum", enumType: 'string' 
        // sqlType is infered from variable
        // there is no 'enum' sql type (I think its inherited from hibernate)
        // enumType: 'string' is by default  
    }
}

existing hibernate types

这可以是你提到的改变的类:

class Template {

    enum LogType {
        DEBUG, INFO
    }

    LogType lt
} 

EDIT2:

我不建议这样做,但您可以像这样配置底层sql类型(未经测试但应该有效):

static mapping = {
    lt sqlType: 'enum(DEBUG, INFO)'
}

请注意,您的应用程序现在只支持MySQL数据库。