GORM:非常地映射大型文本字段数据库

时间:2012-11-16 15:59:12

标签: grails groovy gorm

我有一个Grails应用程序,它将针对SQL Server或Oracle后端运行。我使用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数据类型的组合以及GORM映射,这些映射允许存储或没有GORM的大文本字段无法正常启动。 / p>

我试过了:

  • text中将类型设置为mappings,但这似乎不起作用。 Oracle抱怨期望content字段的类型为long,而SQL Server在这种情况下需要text类型。

  • type设置为clob,这会传递架构验证,但不允许我将字段设置为字符串值 - GORM需要CLOB类型的数据

如何配置数据库定义和GORM以使其工作?

1 个答案:

答案 0 :(得分:4)

尽管存在问题,最终会出现一种解决方案:通过在启动时查询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
        }

    }
}