将Oracle 10g CLOB与Grails 2.0.1一起使用

时间:2012-04-27 15:21:24

标签: oracle hibernate grails

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

我正在尝试将CLOB数据类型用于我的Domain类中的文本输入字段,但它似乎不起作用。我的第一次尝试是基于我阅读的内容here about GORM,其中使用的是type: 'text',如下例所示:

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

Grails将其映射到我的数据库中的LONG数据类型,即not desirable

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

我后来尝试将该属性定义为java.sql.Clob,即Clob postCode;,但根本不起作用。没有错误消息,但没有任何内容持续存在于DB中。

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

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

OR ...有没有办法覆盖Grails选择的数据类型,以便我可以强制它将postCode type: 'text'映射到CLOB?我不熟悉Hibernate,所以如果有办法,我不知道如何去做。

附注:在我们从Grails 1.3.7升级到2.0.1之前,我很确定type: 'text'实际上确实映射到了Oracle中的CLOB。所以这可能是2.0.1的新内容。

3 个答案:

答案 0 :(得分:11)

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

  

在这种情况下,使用sqlType属性

覆盖列的SQL类型

这似乎有效。

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

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

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 )
}

答案 1 :(得分:2)

可能为时已晚,但我找到了一个解决这个问题的简单方法:

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

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

希望它有所帮助。 伊凡。

答案 2 :(得分:0)

Ivan的回答对我有用。 MaterializedClob是Java String的Hibernate JDBC类型。