tokenの日記: S2Daoでハマる(解決?) 1
次のようなテーブルを、
create sequence user_seq;
create table user (
id integer not null default nextval('user_seq'),
email varchar not null,
targetid integer default null,
delete_flag boolean default false,
versionno integer not null default 1,
primary key(id),
foreign key(targetid) references TARGET(id)
);
を作り、DoltengにUserDaoを作成させる。
1日以上の時間が経った後だった
適当なPageクラスの中で、UserDao#selectById()を実行すると、
[EDAO0019]positrium.tenko.dao.UserDao のupdateメソッドの初期化時に例外が発生しました。理由は org.seasar.framework.exception.SRuntimeException: [EDAO0020]Primary KeyのみのテーブルをSQL文の自動生成で更新することはできません
が発生する。
Primary Keyのみのテーブルぢゃないのに、こんなメッセージっておかしいよなあ。それに、UserDao#update()は呼んでないのに。どこでどんなコードが生成されてるか解らないと、開発ストップだ。
s2-dao-1.0.49.jar
ライブラリのソースを追ってみると、org.seasar.dao.impl.AbstractAutoStaticCommand#setupUpdatePropertyTypes()で、何故か全てのプロパティがPrimary Keyとして認識されてるか、またはプロパティが一切認識されていないかのどちらからしい。ここ、propertyNames変数のサイズがゼロだったらプロパティが認識されていませんとかってメッセージを出した方がいいぞ、絶対。プロパティが一切認識されていない事とPKばかりのテーブル構成とじゃ全然意味が違うし。
でも、それはそれ、としても、プロパティ名とテーブルの列名に食い違いはないんだよなあ。なぞ過ぎ。いったん、sequenceを使わない方法で試してみようかしら。
追記:同日
解決?
とりあえずTomcatを再起動して、Seasar2のHOT deployを初期化(classを最新のものに置き換える?)してみたら、変なエラーは出なくなった。それにしても、さっきのエラーは良くわからない。ちょうどプロパティが一切認識されていない状況だったのはアタリだったけど、update()が呼ばれたのは想定外。S2Daoってdaoの健全性テストまでしっかりチェックするのかなぁ・・。
ちなみに、sequenceとか関係なかった。
ご指摘ありがとうございます。 (スコア:1)
S2Daoのコミッタやっております。
ご指摘の件、プロパティが見つからない場合と主キーのみの場合で例外メッセージを区別するように修正しました。
http://svn.seasar.org/browse?view=rev&root=s2dao&revision=1289 [seasar.org]
次バージョン(1.0.50)に含まれます。