[Seasar-user:18372] Re: [DBFlute] update での EntityAlreadyUpdatedException
kubo
[E-MAIL ADDRESS DELETED]
2009年 8月 24日 (月) 13:27:11 JST
久保(jflute)です。
なるほど、publicメソッド全てがAOP対象なのですね。
とにもかくにも原因が掴めて良かったです。
2009/8/24 HATTI <[E-MAIL ADDRESS DELETED]>:
> お世話になっております。
> 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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
Seasar-user メーリングリストの案内