[Seasar-user:1342] S2Dao の更新処理 (Timestamp による排他制御付き ) で例外が発生します。
kamikawa@bbreak.co.jp
kamikawa
2004年 12月 10日 (金) 14:36:30 JST
はじめまして、上川と申します。
S2Dao(1.0.12)を使って、「Timestampによる排他制御」を用いた更新処理を実行すると、
DBの更新が終わった後に、以下のような例外が発生します。
----------------------------------------
java.lang.ArrayIndexOutOfBoundsException: 17
at org.seasar.dao.impl.UpdateAutoHandler.updateBean(UpdateAutoHandler.java:47)
at org.seasar.dao.impl.AbstractAutoHandler.execute(AbstractAutoHandler.java:64)
at org.seasar.dao.impl.AbstractAutoHandler.execute(AbstractAutoHandler.java:45)
at org.seasar.dao.impl.AbstractAutoStaticCommand.execute(AbstractAutoStaticCommand.java:22)
at org.seasar.dao.interceptors.S2DaoInterceptor.invoke(S2DaoInterceptor.java:37)
...(省略)
----------------------------------------
こちらで使用している、更新するオブジェクトのクラスには、
検索時にしか使わないCOLUMNアノテーション定数を宣言しております。
# 即ち、クラスに対応するテーブルのカラム数より多いCOLUMNアノテーション定数を宣言している。
このようなエラーが発生する場合の回避策は、どのようになるでしょうか。
それとも、「カラム数より多いCOLUMNアノテーション定数を宣言する」という、
使い方が邪道なのでしょうか?
# 検索用と更新用でクラスを分ければ良いと言われれば、それまでですが...
一応、ソース(org.seasar.dao.impl.UpdateAutoHandler#updateBean(Object, Object[]))を見てみたところ、
DBテーブルを更新した後に、Javaオブジェクトのtimestamp値を更新するために、
----------------------------------------
if (bmd.hasTimestampPropertyType()) {
for (int i = 0; i < bmd.getPropertyTypeSize(); ++i) {
PropertyType pt = bmd.getPropertyType(i);
if (pt.isPersistent()
&& !pt.isPrimaryKey()
&& !pt.getPropertyName().equals(
BeanMetaData.VERSION_NO_PROPERTY_NAME)
&& pt.getPropertyName().equalsIgnoreCase(
BeanMetaData.TIMESTAMP_PROPERTY_NAME)) {
PropertyDesc pd = pt.getPropertyDesc();
pd.setValue(bean, bindVariables[i]);
}
}
}
----------------------------------------
という処理をしているので、
・ifに入って一度更新したら、returnする。
・bindVariablesのlengthを気にする。
等で、ソース的には回避できるかな、という気はしています。
以上、よろしくお願い致します。
--
上川伸彦 <[E-MAIL ADDRESS DELETED]>
株式会社ビーブレイクシステムズ - http://www.bbreak.co.jp
東京都品川区西五反田2-28-2-5F : 03-5487-7855
Seasar-user メーリングリストの案内