[Seasar-user:18370] Re: [DBFlute] update での EntityAlreadyUpdatedException

HATTI [E-MAIL ADDRESS DELETED]
2009年 8月 24日 (月) 11:06:00 JST


お世話になっております。
hatti です。

> こういうときはログを真っ先にみて比較するのが
> 良いので今後もぜひ参考にして下さい。
了解いたしました。
ログ解析を失念しておりました。

> あと個人的には、NumberFormatExceptionはcatchせずに
> そのままthrowした方がいいのかなと思います。
> (業務的に-1に意味があるのであれば仕方ないですが)
ご指摘ありがとうございます。
現在作っているアプリは「-1」に意味を無効値として扱っているので、
そのように進めています。

追記:
やはり spring aop による public メソッド呼出が原因でした。
spring 管理下のコンポネントの public メソッドを呼び出すと、
インターセプタが起動して予期せぬ動作になってしまいます。

public final とすると、spring 側でオーバライドできなくなり、
正常な動作になるみたいなのですが、それはそれで業務側でオーバライドできなくなるため、
別の策を調査中です。

2009/08/23 14:21 に kubo<[E-MAIL ADDRESS DELETED]> さんは書きました:
> 久保(jflute)です。
>
> 原因追及が進んだようで良かったです。
> こういうときはログを真っ先にみて比較するのが
> 良いので今後もぜひ参考にして下さい。
>
> あと個人的には、NumberFormatExceptionはcatchせずに
> そのままthrowした方がいいのかなと思います。
> (業務的に-1に意味があるのであれば仕方ないですが)
>
> 2009/8/23 HATTI <[E-MAIL ADDRESS DELETED]>:
>> お世話になっております。
>> hatti です。
>>
>> SQLログを比較してみたところ、
>> 原因と思われる箇所がわかりました。
>>
>> なぜか bean.getIntUserId() の部分で、
>> 「-1」が返されて存在しないデータを更新しようとしているようでした。
>> getIntUserId() は userId を String -> Integer 変換しているメソッドなのですが、
>> なぜか userId が null になってしまいNumberFormatException となってしまっているようです。
>> (※Exceptionの際は -1 を返すようにしています。)
>>
>> 普通に、bean.userId と参照するとString で正常な値を取得できるのですが、
>> デバッグを getIntUserId 内で止めると、bean のインスタンス変数が全て null になってしまっていました。
>> bean は spring 管理下(CGLIB 使用)のオブジェクトなのですが、
>> そこらへんが影響してるのかもしれません。
>>
>> 引き続き調査してみます。
>> 大変お手数おかけいたしました。
>>
>> 以上、よろしくお願いいたします。
>>
>> 2009/08/23 10:20 に kubo<[E-MAIL ADDRESS DELETED]> さんは書きました:
>>> 久保(jflute)です。
>>>
>>> hattiさん、こんにちは
>>>
>>> まずは、その二つのパターンのときのSQLのログを
>>> 比較してみて下さい。
>>>
>>> 2009/8/23 HATTI <[E-MAIL ADDRESS DELETED]>:
>>>> お世話になっております。
>>>> hatti です。
>>>>
>>>> DBFlute9.5.3 (生成は 9.5.4-S) / OracleXE(10g) を使用しております。
>>>> 特に急ぎの質問ではないため、時間のあるときに回答いただけるとありがたいです。
>>>>
>>>> あるテーブルを更新する際に、
>>>> EntityAlreadyUpdatedException が発生してしまいます。
>>>> 以下がそのコードです。
>>>>
>>>> **************************************************
>>>>        public MstUser processUpdate(final UserBean bean) {
>>>>                MstUser userEntity = new MstUser();
>>>> //              Beans.copy(bean, userEntity).execute();
>>>> *               userEntity.setUserId(bean.getIntUserId());
>>>> *               userEntity.setVerNo(bean.verNo);
>>>>                mstUserBhv.update(userEntity);
>>>>                return userEntity;
>>>>        }
>>>> ***************************************************
>>>> これはService クラスのメソッドです。
>>>> Action -> Service -> Bhv という形の作りです。
>>>>
>>>> userEntity の setter を呼んで、userId/verNo をセットし、 update を呼ぶと例外になってしまいます。
>>>> ただ、 setter (*) をコメント化し、 Beans.copy (//)を呼べば正常に更新ができます。
>>>>
>>>> Beans.copy は seasar の util です。
>>>> (DIコンテナ自体は spring を使っていますが、、)
>>>>
>>>> なにか原因がお分かりになればご教示いただけると助かります。
>>>> 以上、よろしくお願いいたします。
>>>> _______________________________________________
>>>> Seasar-user mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>>
>>> _______________________________________________
>>> Seasar-user mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>
>> _______________________________________________
>> Seasar-user mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>


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