5

我正在开发一个使用 Oracle 10g 和 Grails v2.0.1 的项目。

我正在尝试对我的 Domain 类中的文本输入字段使用 CLOB 数据类型,但它似乎不起作用。我的第一次尝试是基于我在这里读到的关于 GORM的内容,其中说使用type: 'text',就像这个例子:

class Address {
   String number
   String postCode
   static mapping = {
       postCode type: 'text'
   }
}

Grails 将其映射到LONG我的数据库中的数据类型,这是不可取的

第二次尝试是尝试type: 'clob'。这在使我的 DB 数据类型为 CLOB 方面很有效,但导致了类转换错误,因为属性本​​身被定义为字符串,即String postCode. (请注意,我从未type:'clob'在文档中看到过,但我可以从方言类中推断出clob可能是那里的有效输入)

我随后尝试将属性定义为java.sql.Clob, ie Clob postCode;,但这根​​本不起作用。没有错误消息,但也没有任何东西被持久化到数据库中。

我采取了保留该Clob方法的最后一步,但使用了一个瞬态String属性,其中 getter/setter 尝试将瞬态 String 值映射到持久 Clob 字段。但我无法弄清楚如何将我的字符串值放入 Clob。Grails 不会抛出错误,但println()在我尝试分配之后永远不会打印。我试过用myClob.setString(1, theString)做作业,但没有成功。

所以长话短说,我似乎无法在我的场景中使用 Clob,我想知道是否有其他人已经看到并能够克服它。如果是这样,你能告诉我我可能做错了什么吗?

或者...有没有办法覆盖 Grails 选择的数据类型,以便我可以强制它映射postCode type: 'text'到 a CLOB?我不精通Hibernate,所以如果有办法,我不知道该怎么做。

旁注:在我们从 Grails 1.3.7 升级到 2.0.1 之前,我很确定type: 'text'确实映射到 Oracle 中的 CLOB。所以这对 2.0.1 来说可能是新的。

4

3 回答 3

11

想我在Custom Hibernate Types的文档中找到了答案。

在这种情况下,使用 sqlType 属性覆盖列的 SQL 类型

这似乎工作。

看起来我可以使用它来强制我的数据库类型为 CLOB,同时保持 java 类型为字符串。换句话说,也许type选择 DB 类型和 Java 类型来处理字段?但是sqlType提供了更多粒度来指定要使用的数据库类型。

所以在我的例子中,上面的示例域类应该是这样的:

class Address {
    String number
    String postCode
    static mapping = {
        postCode sqlType: 'clob'
    }
} 

我从关于该主题的另一个 StackOverflow 问题中收集到这一点(问题本身让我明白了这一点,而接受的答案却误导了我!):

我花了一天时间试图弄清楚这一切,这非常令人沮丧。所以也许我在这里关于这个主题的笔记会帮助其他人避免这种经历!


虽然我在这里做笔记......这篇文章在解决如何在我的映射中更具体的问题方面被证明是有用的:

此处转载了有趣的代码:

//CONFIG.GROOVY (maps a custom SixDecimal type)
grails.gorm.default.mapping = {
    'user-type'( type: SixDecimalUserType, class: SixDecimal )
}
于 2012-04-27T16:14:21.550 回答
2

可能为时已晚,但我找到了一个非常简单的解决方案:

class MyDomain{
  String myField
  ...
  static mapping = {    
    myField type:'materialized_clob'        
  }
}

不需要其他任何东西,写和读就像魅力一样!:D

希望能帮助到你。伊万。

于 2013-06-12T12:44:56.367 回答
0

伊万的回答对我有用。MaterializedClob 是 Java 字符串的 Hibernate JDBC 类型。

于 2015-04-23T21:44:21.247 回答