[Seasar-user:1204] Oracle JDBC(Thin) + S2DaoでのCLOBの扱い

Hikaru Taniguchi taniguchi
2004年 11月 24日 (水) 20:51:07 JST


こんにちは、たにぐちです。

標題の件、一人グチグチとはてなダイアリーに書いていて、「動くには動いた
がなんかスッキリしない」と思ったので質問がてらメールしてます。
 - http://d.hatena.ne.jp/tanigon/20041124#p1
 - http://seasarproject.g.hatena.ne.jp/tanigon/20041124#p1

OracleのJDBCドライバ(Thin)が悪いのは悪いと思うのですが、そもそもS2Dao
でOracle(JDBC(Thin))で CLOBを扱ってる人って実はあんまりいないのでしょ
うか?

いまのところ以下のような問題点があります

(select編)
 - OracleのJDBCドライバは CLOB列に対する ResultSet#getString()に対して、
   nullを返す
   (結果として DTO(もしくはEntity)上で Stringとして扱えない。Clobとし
    て扱うことはできるが、なんだかヘンな気がする?)
   - で、この問題はsetterを別に用意してやることで強引に回避できました

(insert/update編)
 - OracleのJDBCドライバは CLOB列に対するinsert/updateは setString()で
   文字列としてセットしてやればセットできる。ただし、VARCHAR2の影響を
   受けるらしく、2000文字未満ぐらいしか使えない
 - CLOBを使うぐらいなので長いテキストを使いたいが、上のような制約がある
   のでjava.sql.Clobを使う必要がある (理屈の上では)
 - しかし実際には 
     http://seasarproject.g.hatena.ne.jp/tanigon/20041124#p4
   に書いたようなことで Oracleの流儀のためにわざわざ回避策を取る必要が
   ある. おまけにSELECT FOR UPDATEでロケータの取得を先に行う必要がある
   ためにいまのところ S2Daoの恩恵にあずかるのは難しい。

本来、CLOB列を使うとなると VARCHAR2()じゃ入らないかもしれない場合にそ
ういった設計をするかと思うので、この「ロケータを使う必要があるわ、おま
けにOracle独自の流儀だわ」ってのはかなり悲しいものがあるのですが、これっ
て本当なんでしょうか??

とりあえずいまのところ S2Daoの恩恵は受けられない(しかもS2Dao/S2JDBCが
原因ではない)のが凄く悲しいのですが、他の方はどうされているのかと思い
質問したくメールしました。

# なんかただ私が勘違いしてるだけなら恥ずかしいのですが...

Wikiに書こうかと思ったのですが、かなり不正確なネタのような気がしたので
とりあえずこちらに...(どういう意味)。

なにか意見をいただければ光栄です。

--
Hikaru Taniguchi <[E-MAIL ADDRESS DELETED]>



Seasar-user メーリングリストの案内