[Seasar-user:14019] Re: [DBFlute]deleteNonstrictの挙動について質問

k.moriwaki [E-MAIL ADDRESS DELETED]
2008年 4月 30日 (水) 19:16:37 JST


森脇です。

>  存在しないPKでdeleteNonstrict()を実行したときに、
>  確かに
>  「EntityAlreadyDeletedException」
>  ではなく
>  「EntityAlreadyUpdatedException」
>  が発生してしまうようです(再現しました)。
>  ※updateNonstrict()でも同じようですね
再現できて良かったです。

>  これはDBFluteのバグですので、修正致します。
>  (詳細に関してはまた連絡いたします)
了解しました。


また、DBFluteに関して質問するかもしれませんがよろしくお願いします。

2008/04/30 18:56 kubo <[E-MAIL ADDRESS DELETED]>:
> 久保です。
>
>  情報提供ありがとうございます。
>
>  存在しないPKでdeleteNonstrict()を実行したときに、
>  確かに
>  「EntityAlreadyDeletedException」
>  ではなく
>  「EntityAlreadyUpdatedException」
>  が発生してしまうようです(再現しました)。
>  ※updateNonstrict()でも同じようですね
>
>  申し訳ございません。
>  これはDBFluteのバグですので、修正致します。
>  (詳細に関してはまた連絡いたします)
>
>
>
>  2008/4/30 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>  > 久保さん
>  >  森脇です。早速の返答ありがとうございます。
>  >
>  >  >  申し訳ありませんが、
>  >  >  UTのテストコードを差し支えない範囲で
>  >  >  見せて頂けますでしょうか?
>  >  UTのテストコードとLogicクラスは以下のような感じになっています。
>  >  テーブルは更新番号と更新日時両方ありますが、排他には更新番号を利用しています。
>  >
>  >  ---------- UTここから ----------
>  >  @RunWith(Seasar2.class)
>  >  public class AaaLogicImplTest {
>  >    〜プロパティ略〜
>  >
>  >     public void testDeleteAaa_2() {
>  >         try {
>  >             logic.deleteWatchlistTbl(999);
>  >         } catch (EntityAlreadyUpdatedException e) {
>  >             e.printStackTrace();  // ここで出力したログが前回のメールで送付したもの
>  >             assertEquals(EntityAlreadyUpdatedException.class, e.getClass());
>  >             return;
>  >         } catch (Exception exception) {
>  >             fail("予期しない例外");
>  >         }
>  >         fail("例外が発生しない");
>  >     }
>  >  }
>  >  ---------- UTここまで ----------
>  >
>  >  ---------- Logicここから ----------
>  >  public class AaaLogicImpl implements AaaLogic {
>  >     @Override
>  >     public void deleteAaa(int id) {
>  >         AaaTbl aaa = new AaaTbl();
>  >         aaa.setId(id);
>  >         AaaTblBhv.deleteNonstrict(aaa);
>  >     }
>  >  }
>  >  ---------- Logicここまで ----------
>  >
>  >
>  >  >  (あとデータベースのテーブル構造や
>  >  >   データがどのような状況なのか)
>  >  データベースのテーブル構造は以下の通りで、データはS2JUnit4の機能を利用して
>  >  テスト実行時にデータを全て入れ替えています。
>  >   -> http://s2container.seasar.org/2.4/ja/S2JUnit4.html#tipsAllReplace
>  >  なのでデータはidが1のデータのみが存在する状態になっています。
>  >
>  >
>  >  ---------- テーブル構造ここから(DBはMySQLです) ----------
>  >  CREATE TABLE aaa_tbl (
>  >   id INT unsigned NOT NULL auto_increment,
>  >   bbb_id INT unsigned NOT NULL default '0',
>  >   ccc_id INT unsigned NOT NULL default '0',
>  >   abc_flg CHAR(1) NOT NULL default '0',
>  >   version_no INT unsigned NOT NULL default '1',
>  >   update_datetime DATETIME NOT NULL default '0000-00-00 00:00:00',
>  >   logical_delete_flg CHAR(1) NOT NULL default '0',
>  >   PRIMARY KEY (id)
>  >  ) TYPE=InnoDB;
>  >  ---------- テーブル構造ここまで ----------
>  >
>  >
>  >  以上になります。
>  >
>  >
>  >  2008/04/30 16:50 kubo <[E-MAIL ADDRESS DELETED]>:
>  >
>  >
>  > > 久保です。
>  >  >
>  >  >  森脇さん、こんにちは
>  >  >
>  >  >  申し訳ありませんが、
>  >  >  UTのテストコードを差し支えない範囲で
>  >  >  見せて頂けますでしょうか?
>  >  >  (あとデータベースのテーブル構造や
>  >  >   データがどのような状況なのか)
>  >  >
>  >  >  ログで
>  >  >
>  >  > {999,null,null,null,null,null,null}
>  >  >  とあるので、999のレコードは存在しないPK値なのかどうか?
>  >  >  とか、VERSION_NOカラムはどう扱っているのか?
>  >  >  などなど気になる点があります。
>  >  >  情報頂けましたら、詳細な回答ができると思います。
>  >  >
>  >  >  2008/4/30 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>  >  >
>  >  >
>  >  > > 森脇と申します。
>  >  >  >  BehaviorのdeleteNonstrictの挙動について質問です。
>  >  >  >
>  >  >  >  Seasar Conference 2007 Autumnの「現場ソリューションDBFlute.pdf」を
>  >  >  >  参考にしているのですが、103ページに記載されている「Behaviorの更新系メソッド」の
>  >  >  >  注意書きで
>  >  >  >  updateNonstrict()とdeleteNonstrict()は、対象のEntityが存在しない場合に
>  >  >  >  EntityAlreadyDeletedException が発生します。
>  >  >  >  とあるのですが、UTを作成して実行してみるとEntityAlreadyUpdatedExceptionが
>  >  >  >  発生します。
>  >  >  >
>  >  >  >  環境と発生時のログは以下になります。
>  >  >  >  なにか設定が必要なのでしょうか?自動生成時のプロパティファイルは0.6.9に付属していた
>  >  >  >  ファイルをほぼそのまま使っています。
>  >  >  >
>  >  >  >  環境
>  >  >  >   Seasar 2.4.25
>  >  >  >   S2Dao 1.0.48
>  >  >  >   DBFlute 0.6.9
>  >  >  >
>  >  >  >  ログ
>  >  >  >  hoge.fugo.db.common.exception.EntityAlreadyUpdatedException:
>  >  >  >  [EDAO0005]更新の対象は1行(実際:0)でなければなりません。({999,null,null,null,null,null,null})
>  >  >  >         at hoge.fugo.db.common.s2dao.S2DaoInterceptor.dispatchInvoking(S2DaoInterceptor.java:134)
>  >  >  >         at hoge.fugo.db.common.s2dao.S2DaoInterceptor.invoke(S2DaoInterceptor.java:67)
>  >  >  >         at hoge.fugo.db.exdao.AaaDao$$EnhancedByS2AOP$$1f365b2$$MethodInvocation$$deleteNonstrict12.proceed(MethodInvocationClassGenerator.java)
>  >  >  >         at hoge.fugo.db.exdao.AaaDao$$EnhancedByS2AOP$$1f365b2.deleteNonstrict(AaaDao$$EnhancedByS2AOP$$1f365b2.java)
>  >  >  >         at hoge.fugo.db.bsbhv.BsAaaBhv.delegateDeleteNonstrict(BsAaaBhv.java:461)
>  >  >  >         at hoge.fugo.db.bsbhv.BsAaaBhv$11.callbackDelegateDeleteNonstrict(BsAaaBhv.java:333)
>  >  >  >         at hoge.fugo.db.bsbhv.BsAaaBhv$11.callbackDelegateDeleteNonstrict(BsAaaBhv.java:332)
>  >  >  >         at hoge.fugo.db.common.bhv.AbstractBehaviorWritable.helpDeleteNonstrictInternally(AbstractBehaviorWritable.java:251)
>  >  >  >         at hoge.fugo.db.bsbhv.BsAaaBhv.deleteNonstrict(BsAaaBhv.java:332)
>  >  >  >         at hoge.fugo.tender.logic.impl.AaaLogicImpl.deleteAaa(AaaLogicImpl.java:91)
>  >  >  >         at hoge.fugo.tender.logic.impl.AaaLogicImplTest.testDeleteAaa_2(AaaLogicImplTest.java:128)
>  >  >  >         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>  >  >  >         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>  >  >  >         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>  >  >  >         at java.lang.reflect.Method.invoke(Method.java:597)
>  >  >  >         at org.seasar.framework.unit.S2TestMethodRunner.executeMethodBody(S2TestMethodRunner.java:678)
>  >  >  >         at org.seasar.framework.unit.S2TestMethodRunner.executeMethod(S2TestMethodRunner.java:653)
>  >  >  >         at org.seasar.framework.unit.S2TestMethodRunner.runTest(S2TestMethodRunner.java:619)
>  >  >  >         at org.seasar.framework.unit.S2TestMethodRunner.runMethod(S2TestMethodRunner.java:255)
>  >  >  >         at org.seasar.framework.unit.S2TestMethodRunner.run(S2TestMethodRunner.java:171)
>  >  >  >         at org.seasar.framework.unit.S2TestClassMethodsRunner.invokeTestMethod(S2TestClassMethodsRunner.java:227)
>  >  >  >         at org.seasar.framework.unit.S2TestClassMethodsRunner.run(S2TestClassMethodsRunner.java:89)
>  >  >  >         at org.seasar.framework.unit.S2TestClassRunner.run(S2TestClassRunner.java:67)
>  >  >  >         at org.seasar.framework.unit.Seasar2.run(Seasar2.java:168)
>  >  >  >         at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
>  >  >  >         at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>  >  >  >         at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
>  >  >  >         at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
>  >  >  >         at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
>  >  >  >         at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
>  >  >  >  _______________________________________________
>  >  >  >  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 メーリングリストの案内