Grails GORM:不可知地映射大型文本字段数据库

Grails GORM:不可知地映射大型文本字段数据库,grails,groovy,gorm,Grails,Groovy,Gorm,我有一个Grails应用程序,可以在SQL Server或Oracle后端上运行。我使用GORM作为ORM 我想以支持两种数据库类型的方式映射一个大的文本字段。在我的Grails域类中,我有如下内容: class Note { String content static constraints = { content nullable: false, blank: false } } 然后声明如下所示的数据库表: -- oracle CREATE TA

我有一个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在启动时以验证模式运行,我找不到Oracle和SQL Server数据类型以及GORM映射的组合,这些组合允许在GORM无法正确启动的情况下存储或大型文本字段

我试过:

在映射中将类型设置为text,但这似乎不起作用。Oracle抱怨希望内容字段的类型为long,而SQL Server希望在这种情况下使用文本类型

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


我应该如何配置我的数据库定义和GORM来实现这一点

尽管很老套,最终还是出现了一个解决方案:通过在启动时查询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
        }

    }
}

尽管如此,最终还是出现了一个解决方案:通过在启动时查询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
        }

    }
}