2012-04-27 76 views
5

我正在使用Oracle 10g和Grails V2.0.1的项目。Grails中使用Oracle 10g CLOB 2.0.1

我想在我的领域类用于文本输入字段CLOB数据类型,它似乎并不奏效。我第一次尝试是基于什么我读here about GORM,哪里是说,使用type: 'text',像这样的例子:映射

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

Grails的,要在我的数据库一个LONG数据类型,这是not desirable

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

我后来试图定义属性为java.sql.Clob,即Clob postCode;,那没”根本不工作。没有错误消息,但没有任何东西持续到数据库。

我把保持Clob方法,但使用瞬时String财产,其中getter/setter方法试图映射瞬态字符串值,以持久CLOB字段的最后一步。但我无法弄清楚如何让我的字符串值进入Clob。 Grails不会抛出错误,但在尝试分配后,println()从不打印。我试过使用myClob.setString(1, theString)来做任务,但没有成功。

因此,为了使长话短说,我似乎无法在我的情况下使用CLOB和我想知道是否有人看到了这一点,并能够克服它。如果是这样,你能告诉我我可能会做错什么吗?

或者是否有一种方法可以覆盖Grails选择的数据类型,以便我可以强制它将postCode type: 'text'映射到CLOB?我不熟悉Hibernate,所以如果有办法,我不确定如何去做。

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

+0

那么在[2.0.x文档](http://grails.org/doc/2.0.x/ref/Database%20Mapping/type.html)中实际上是写在你的案例类型将是clob,但我没有必要使用这个,所以我不能保证这是2.0.x的工作 – 2012-04-27 15:59:19

回答

11

认为我找到了一个答案夹在Custom Hibernate Types文件。

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

这似乎是工作覆盖列的SQL类型。

看起来像我能够用它来迫使我的数据库类型为CLOB,同时保持了Java类型的字符串。换句话说,也许type选择数据库类型和Java类型来处理字段?但是sqlType给出了更多的粒度来指定要使用的数据库类型。

所以上面的示例域类应该看起来像这样在我的情况:

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

我收集从另一个StackOverflow的问题在主题(这个问题本身避让我,而接受的答案误导了我! ):

我花了一天时间试图弄清楚这一切了,这是令人难以置信的FRU strating。所以也许我关于这个话题的笔记会帮助其他人避免这种体验!


虽然我做笔记这里...这篇文章中的故障排除如何在我的映射得到更具体的方面证明了有些有用:

有趣代码从这里转载:

//CONFIG.GROOVY (maps a custom SixDecimal type) 
grails.gorm.default.mapping = { 
    'user-type'(type: SixDecimalUserType, class: SixDecimal) 
} 
+0

太棒了!它插入和检索正确的字符串> 4000个字符。 – Tobia 2015-06-10 16:30:29

1

Proba布莱为时已晚,但我发现了一个非常简单的解决了这个问题:

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

没有别的要求,写入和读取般的魅力的作品! :D

希望它有帮助。 Ivan。

0

Ivan的答案适合我。 MaterializedClob是Java字符串的Hibernate JDBC类型。