GORM:绘制大文本字段不可知数据库(GORM: mapping large text fields

2019-07-03 21:23发布

我将运行对无论是SQL Server或Oracle后端Grails应用。 我使用GORM作为一个ORM。

我要一个大的文本字段,同时支持数据库类型的方式映射。 在我的Grails领域类我有这样的:

class Note {
    String content

    static constraints = {
        content nullable: false, blank: false
    }
}

然后我声明看起来是这样的数据库表:

-- oracle
CREATE TABLE NOTE 
(
    id NUMBER(19, 0) NOT NULL,
    version NUMBER(19, 0) NOT NULL,
    content CLOB NOT NULL
);

-- SQL Server
CREATE TABLE NOTE 
(
    id NUMERIC(19, 0) NOT NULL,
    version NUMERIC(19, 0) NOT NULL,
    content NVARCHAR(MAX) NOT NULL
);

GORM在运行validate模式启动时,我无法找到Oracle和SQL Server数据类型和格姆映射,允许存储或大文本字段,而格姆无法正常启动的组合。

我试过了:

  • 设置类型textmappings ,但这似乎并没有工作。 甲骨文抱怨期待的content领域为类型的long ,和SQL Server想要一个类型的text在这种情况下。

  • 设置typeclob ,其通过模式验证,但随后不允许我设置字段作为一个字符串值-格姆预计类型的数据CLOB

我应该如何配置我的数据库定义和格姆,使这项工作?

Answer 1:

作为hackish的,因为它是一个解决方案,最终出现了:通过查询在启动时Grails的配置,可以选择适当的数据类型。

class Note {

    String content

    static constraints = {
        content nullable: false, blank: false
    }

    static mappings = {
        content sqlType: DbSupport.bigStringType
    }
}

class DbSupport {

    static def getBigStringType() {

        // examine which hibernate dialect is selected, and pick
        // an appropriate type mapping for that database type:
        def dialect = ApplicationHolder.application.config.dataSource.dialect
        switch (dialect) {

            case "org.hibernate.dialect.SQLServerDialect":
                return "nvarchar"
                break

            case "org.hibernate.dialect.Oracle10gDialect":
                return "clob"
                break
        }

    }
}


文章来源: GORM: mapping large text fields database agnostically