Grails GORM:不可知地映射大型文本字段数据库
我有一个Grails应用程序,可以在SQL Server或Oracle后端上运行。我使用GORM作为ORM 我想以支持两种数据库类型的方式映射一个大的文本字段。在我的Grails域类中,我有如下内容: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
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
}
}
}