gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:09:04 25 4
gpt4 key购买 nike

这是我的环境

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

最佳答案

首先回答你的问题 - 你在文档中对此进行了解释:

enumType (optional) - The enum type in for type-safe Enum properties. Either ordinal or string. link

这意味着您可以使用:

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

Note: Ordinal number is position in its enum declaration, where the initial constant is assigned an ordinal of zero. link

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

...

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

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

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

  • 您的表使用可为 null 的 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),其中包含提到的更改:

class Template {

enum LogType {
DEBUG, INFO
}

LogType lt
}

编辑2:

我不推荐这样做,但您可以像这样配置底层sql类型(未经测试但应该可以工作):

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

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

关于mysql - 将 grails/groovy 枚举映射到 Mysql 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40525936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com