5

Oracle10gとGrailsv2.0.1を使用したプロジェクトに取り組んでいます。

Domainクラスのテキスト入力フィールドにCLOBデータ型を使用しようとしていますが、機能していないようです。私の最初の試みは、 GORMについてここで読んだものに基づいていました。ここではtype: 'text'、次の例のように、を使用すると言われています。

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

GrailsLONGはそれを私のDBのデータ型にマッピングしましたが、これは望ましくありません

2番目の試みは試してみることでしたtype: 'clob'。これは、DBデータ型をCLOBにするのに効果的でしたが、プロパティ自体が文字列として定義されていたため、クラスキャストエラーが発生しましたString postCode。(私はドキュメントで見たことがないことに注意してください、しかし私はそこで有効な入力であるかもしれないtype:'clob'方言クラスから推測することができました)clob

java.sql.Clobその後、プロパティを、、つまり、として定義しようとしましたClob postCode;が、まったく機能しませんでした。エラーメッセージはありませんが、DBにも何も永続化されていませんでした。

Clobアプローチを維持する最後のステップを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の新機能である可能性があります。

4

3 に答える 3

11

Custom Hibernate Typesのドキュメントに答えが隠れているのを見つけたと思います

その場合、sqlType 属性を使用して列の SQL タイプをオーバーライドします。

これは機能しているようです。

これを使用して、DB タイプを強制的に CLOB にしながら、Java タイプを String に保つことができるようです。つまり、typeフィールドの処理に DB 型と Java 型の両方を選択するのではないでしょうか。ただしsqlType、使用する DB タイプを指定するための粒度がもう少し高くなります。

したがって、上記のサンプル Domain クラスは、私の場合は次のようになります。

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

このトピックに関する別の StackOverflow の質問からこれを収集しました (質問自体は私を手がかりにしましたが、受け入れられた回答は私を誤解させました!):

私はこれをすべて理解しようと 1 日を費やしましたが、信じられないほどイライラしました。したがって、ここでのトピックに関する私のメモは、他の誰かがその経験を避けるのに役立つかもしれません!


そして、ここにメモを残している間...この投稿は、マッピングをより具体的にする方法のトラブルシューティングに関して多少役立つことがわかりました。

そこからの興味深いコードがここに再現されています。

//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 に答える