我有一个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以使其工作?
答案 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
}
}
}