2

我有一个将针对 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
);

GORMvalidate在启动时以模式运行,我找不到 Oracle 和 SQL Server 数据类型和 GORM 映射的组合,它们允许存储或大型文本字段,而没有 GORM 无法正确启动。

我试过了:

  • 将类型设置为textin mappings,但这似乎不起作用。Oracle 抱怨期望该content字段为 type long,而 SQL Servertext在这些情况下需要 type of 。

  • 设置typeto clob,它通过模式验证但不允许我将字段设置为字符串值 - GORM 需要类型的数据CLOB

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

4

1 回答 1

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
        }

    }
}
于 2012-11-16T16:38:20.343 回答