Exception occurred inside setter でハマッた。

ここ1週間、久しぶりにプログラムでハマってました。ので、戒(イマシ)めも込めて健忘記録です。

まずはトラブルの内容ですね。

strutsとhibernateによるイントラ内で動作するWebアプリを4年前に作ったのですが、当時は結局のところ未運用でした。最近になって運用を開始するコトになったのですが、仕様を若干変更することになりまして、ひとつがサーバーOSをLinuxからWindowsにすることで、もうひとつが閲覧者自身が「ユーザー登録」をオンラインでできるようにすること。で、問題は2つ目の変更で、ユーザーにパスワード項目を追加するという作業です。データベースに項目を追加し、Hibernateの定義xmlも変更、対応するクラスにも項目とsetter・getterを追加しましたが、この状態で、登録は出来ても、読み込みが出来ませんでした。

そこでのerrorは、Hibernate.Query.list()の実行時に、「Exception occurred inside setter of hogehoge」というものでした。

結局のところ、テーブルの新規項目が原因

最初は変更すべきポイントが、テーブル・定義XML・クラス以外にあるのではないか?と自分を疑りましたが、思い当たるフシはなく、実際に登録処理(クラス側からテーブルへ)が、ちゃんと出来ているのだから、hibernateの設定は正しく思えました。ってことはHibernate.Session.save()は「まる」で、Hibernate.Query.list()を実行する際に「ペケ」になるのだな・・・と、まだHibernate犯人説から抜け出せません。HQLを書き換えたりしてチェックするも、現象は改善されません。いろいろググッても的確な情報は入手できないまま1週間が経過しました。

で、ふと、さっき(J-comの親切な営業さんが手続きの説明に来訪されているトキに)、tail -f君(stdout…log)からsetterに関して文句言われてますけど、「クラスからテーブル」で満足しても、「テーブルからクラス」で満足できないモノ・・・って何?・・・と、考えているとヒラメキました。テーブルの新規フィールドにはヌルデータが埋まっていて、「無」はクラスにsetterできないよ・・・ってのカモ?

で、早速「update hoge_table set hoge_newfield? = ‘hoge’;」とSQL打ってみたら、あっさりと動作してヤンの。

やられた!コイツが犯人だったとは、お父さん一本取られたね。

Categories: コンピュータ関連 Tags:
  1. No comments yet.