簡體   English   中英

將grails / groovy枚舉映射到Mysql枚舉

[英]Mapping the grails/groovy enum to Mysql enum

這是我的環境

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

但是我沒有使它起作用。 我用谷歌搜索了一些建議,但沒有使它們起作用。

這是我的代碼:

 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(可選)-類型安全的Enum屬性的枚舉類型。 序數或字符串。 鏈接

這意味着您可以使用以下任一方法:

  • enumType: 'ordinal' ,將使用其序號存儲枚舉

注意:序數是其枚舉聲明中的位置,其中初始常量的序數為零。 鏈接

  • enumType: 'string' ,它將存儲帶有枚舉名稱的枚舉

...

對於我在您的代碼中注意到的其他問題:

  • 您無需為枚舉LogType創建自己的name屬性,枚舉已經具有一個,它等於聲明名稱。

  • 如果它們與類/字段名稱相同,則無需顯式定義表/列名稱。

  • 您的表使用可空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
} 

編輯2:

我不建議這樣做,但是您可以像這樣配置底層sql類型(未經測試,但應該可以使用):

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

請注意,您的應用程序現在僅支持MySQL數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM