这是我的环境
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'
}
}
答案 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
}
}
这可以是你提到的改变的类:
class Template {
enum LogType {
DEBUG, INFO
}
LogType lt
}
EDIT2:
我不建议这样做,但您可以像这样配置底层sql类型(未经测试但应该有效):
static mapping = {
lt sqlType: 'enum(DEBUG, INFO)'
}
请注意,您的应用程序现在只支持MySQL数据库。