量産メモ帳

忘れっぽいのでメモを残しています。

iBatis を使って DB を更新しようとした時に UnknownTypeHandler が発生した問題を解決する。

スポンサーリンク

O/R Mapping フレームワークとして、6年ぶりに iBatis を使うことになったが、使い方をすっかり忘れていることに気づいた。。
やっぱり、コードを書いていないと忘れてしまう。。


いくつかハマった問題があったけど、特に DB 更新時に UnknownTypeHandler が発生した件は、解決に時間がかかった。


・・・というか、問題が起きたカラムに javaType と jdbcType を指定してあげれば良かっただけなんだけど、XML をゴリゴリ書くのが嫌で、他に色んな方法を試してみたものの、どれも失敗に終わった。


ちなみに問題が起きたカラムに対応するクラスは、DB のドライバーの中に含まれているもので、java.sql.TimeStamp クラスを拡張した非 public なクラスだった。
TimeStamp のサブクラスなんだから、iBatis が宜しく解釈してくれるだろうと期待をしていたけど、よく考えてみれば、以下の理由でそれは無理だなと、色々と試行錯誤した後にようやく気付いた。

  • もし iBatis が気を利かせて TimeStamp のインスタンスを生成しれても、ドライバーに渡す場合、独自に定義されたサブクラスへのダウンキャストになってしまう。
    • サブクラスでしか定義していないようなフィールドがある場合、情報が欠落した状態が発生する。
  • そもそも、独自クラスが非 puclic なので、iBatis が余程賢くない限り、このクラスを見つけられない。



結果論だけど、変に頭を使わずに SQL Map (XML) を書けば良かった。


参考資料: