【问题标题】:Using Oracle 10g CLOB with Grails 2.0.1在 Grails 2.0.1 中使用 Oracle 10g CLOB
【发布时间】:2012-05-08 08:41:48
【问题描述】:

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

我正在尝试对我的 Domain 类中的文本输入字段使用 CLOB 数据类型,但它似乎不起作用。我的第一次尝试是基于我读到的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;,但这根本不起作用。没有错误消息,但也没有任何东西被持久化到数据库中。

我采取了保持Clob 方法的最后一步,但使用了一个瞬态String 属性,其中getter/setter 尝试将瞬态String 值映射到持久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 来说可能是新的。

【问题讨论】:

  • 2.0.x docs 中实际上写的是,在你的情况下,类型将是 clob,但我还没有使用它,所以我不能保证它适用于 2.0.x

标签: oracle hibernate grails


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    没有其他要求,写和读就像魅力一样! :D

    希望对您有所帮助。 伊万。

    【讨论】:

      【解决方案3】:

      认为我在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 )
      }
      

      【讨论】:

      • 太棒了!它正确插入和检索大于 4000 个字符的字符串。
      猜你喜欢
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 2011-06-20
      • 2010-10-06
      相关资源
      最近更新 更多