【问题标题】:Mapping the grails/groovy enum to Mysql enum将 grails/groovy 枚举映射到 Mysql 枚举
【发布时间】:2016-11-10 10:59:34
【问题描述】:

这是我的环境

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

build.gradle 中的休眠版本

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    |                |

但我没有得到它的工作。我在 Google 上搜索了一些建议,但没有让它们发挥作用。

这是我的代码:

 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'
    }
}

【问题讨论】:

标签: mysql grails enums grails-orm


【解决方案1】:

首先是您的问题-您已在文档中对其进行了解释:

enumType(可选)- 类型安全枚举属性的枚举类型。序数或字符串。 link

这意味着您可以使用任一:

  • enumType: 'ordinal' 将使用其序数编号存储枚举

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

  • enumType: 'string' 将使用其枚举 name 存储枚举

...

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

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

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

  • 您的表使用可为空的 ID

编辑:

所以这是你用我的 cmets 编辑的代码,可以改进/删除

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
} 

编辑2:

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

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

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

【讨论】:

  • 非常感谢您的回答,但我仍然可以让它工作。生成的 SQL 方案是“create table Template (id bigint not null auto_increment, version bigint not null, lt enum not null, primary key (id)) ENGINE=InnoDB”,这不会生成正确的表。我不确定 GORM 是否支持枚举类型映射,也许我应该尝试休眠
猜你喜欢
  • 2011-04-14
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多