[Seasar-user:19242] Re: EntityRowHandler#handle()におけるデータ操作について
kubo
[E-MAIL ADDRESS DELETED]
2010年 2月 5日 (金) 23:19:25 JST
久保(jflute)です。
松原さん、こんばんは
こちらでも再現いたしました。
DBMSによっては発生したりしなかったりしますが、
これはDBFluteのバグです。
フィードバックありがとうございます。
もし、可能であれば、
モジュール:DBFlute-0.9.6.5-SNAPSHOT
ランタイム:0.9.6.5-03-SNAPSHOT
にアップグレードして試して頂けますでしょうか?
動作問題なければ、明らかなバグですので、
近日リリースをしたいと考えます。
もし、開発プロジェクトでアップグレードができない
状況であれば、選択肢 "1" のやり方か、もしくは、
カーソル検索をConditionBeanでなくOutsideSql方式に
差し替えてみて下さい。(OutsideSqlであれば動作します)
ちなみに選択肢 "2" は、そもそもメモリ節約のために
カーソル検索しているのに無意味なことになってしまいます。
2010/2/5 <[E-MAIL ADDRESS DELETED]>:
>
> お世話になっております.松原です.
>
>
> 掲題の件,以下の実装でエラーが発生してしまいます.
>
> 解決方法などありましたら、ご教示して頂けないでしょうか.
>
>
> <環境>
> Java :JRE 1.6.0_13
> DBFlute:DBFlute 0.9.6
>
> <目的>
> EntityRowHandler#handle()内でデータ登録/更新を行いたい.
>
> <理由>
> 大量データから別のテーブルへの登録/削除を行うような処理
> を行いたい.
>
> <現象>
> EntityRowHandler#handle()内で別のBehaviorからデータ登録
> を行うと,1回目のInsertは正常にログ出力されるが,カーソル
> の次データ取得でエラーが発生している.
>
> <質問>
> EntityRowHandler#handle()内で別のBehaviorを使用することは
> できないのでしょうか?
>
> できない場合,
> ①大量データのPrimaryKeyのみを取得し,PrimaryKeyからのループ
> 処理内で詳細データ取得+データ登録を行う
>
> ②EntityRowHandler#handle()内で登録データを配列で保持し,
> Behavior#batchInsert()で一気にデータ登録
>
> の2方式しかないのでしょうか?
>
> 大変申し訳ございませんが,ご教示の程,宜しくお願い致します.
>
> <実装例>
> final EntityRowHandler<YyyXxx> xxxHandler = new EntityRowHandler<YyyXxx>() {
> @Override
> public void handle(YyyXxx xxx) {
> TestYyyXxx dt = new TestYyyXxx();
> dt.setXxxId(xxx.getXxxId());
> testYyyXxxBhv.insert(dt); // データ登録
>
> ArrayList<String[]> data = new ArrayList<String[]>();
> data.add(new String[] {xxx.getXxxId(), xxx.getPoleId()});
> }
> };
>
> final YyyXxxCB cb = new YyyXxxCB();
> cb.query().setXxxType_Equal("620000001923");
>
> yyyXxxBhv.selectCursor(cb, xxxHandler);
>
> <ログ>
> DEBUG 2010.02.05 11:24:13.062,/==============================================================================
> DEBUG 2010.02.05 11:24:13.062, YyyXxxBhv.selectCursor()
> DEBUG 2010.02.05 11:24:13.062, ========================/
> DEBUG 2010.02.05 11:24:13.062,
> DEBUG 2010.02.05 11:24:13.125,論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1265336652375/0, BranchId=]
> DEBUG 2010.02.05 11:24:13.125,
> (***)※1
>
> DEBUG 2010.02.05 11:24:13.421,...Setting up column columns of CNETS_OCW_JBOX before INSERT!
> DEBUG 2010.02.05 11:24:13.421,...Initializing sqlExecution for the key 'CNETS_OCW_JBOX:insert(TestYyyXxx)'
> DEBUG 2010.02.05 11:24:13.421,論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1265336652375/0, BranchId=]
> DEBUG 2010.02.05 11:24:13.421,論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1265336652375/0, BranchId=]
> DEBUG 2010.02.05 11:24:13.468,SqlExecution Initialization Cost: [00m00s047ms]
> DEBUG 2010.02.05 11:24:13.468,/=============================================================================
> DEBUG 2010.02.05 11:24:13.468, TestYyyXxxBhv.insert()
> DEBUG 2010.02.05 11:24:13.468, =======================/
> DEBUG 2010.02.05 11:24:13.468,
> DEBUG 2010.02.05 11:24:13.468,論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1265336652375/0, BranchId=]
> DEBUG 2010.02.05 11:24:13.468,
> (***)※2
>
> DEBUG 2010.02.05 11:24:13.484,論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1265336652375/0, BranchId=]
> DEBUG 2010.02.05 11:24:13.484,===========/ [00m00s016ms result=1]
> DEBUG 2010.02.05 11:24:13.484,
> WARN 2010.02.05 11:24:13.500,SQLException occurred while ResultSet Handling: target=YyyXxx.xxxType
> DEBUG 2010.02.05 11:24:13.515,論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1265336652375/0, BranchId=]
> DEBUG 2010.02.05 11:24:13.531,トランザクションをロールバックしました。tx=[FormatId=4360, GlobalId=1265336652375/0, BranchId=]
> ERROR 2010.02.05 11:24:13.578,BATCH,BridgeBatchApplication,run,CDL-E-00007,例外が発生しました。詳細はログを確認してください。
> org.seasar.dbflute.exception.SQLFailureException: Look! Read the message below.
> /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
> The SQL failed to execute!
>
> [Advice]
> Please confirm the SQLException message.
>
> [SQLState]
> null
>
> [ErrorCode]
> 17006
>
> [SQLException]
> java.sql.SQLException
> 列名が無効です。
>
> [Statement]
> org.seasar.extension.jdbc.impl.PreparedStatementWrapper
>
> [Display SQL]
> (***)※3
>
> * * * * * * * * * */
> at org.seasar.dbflute.resource.SQLExceptionHandler.throwSQLFailureException(SQLExceptionHandler.java:199)
> at org.seasar.dbflute.resource.SQLExceptionHandler.handleSQLException(SQLExceptionHandler.java:57)
> at org.seasar.dbflute.s2dao.sqlhandler.TnBasicHandler.handleSQLException(TnBasicHandler.java:235)
> at org.seasar.dbflute.s2dao.sqlhandler.TnBasicHandler.handleSQLException(TnBasicHandler.java:230)
> at org.seasar.dbflute.s2dao.sqlhandler.TnBasicSelectHandler.execute(TnBasicSelectHandler.java:77)
> at org.seasar.dbflute.s2dao.sqlhandler.TnBasicSelectHandler.execute(TnBasicSelectHandler.java:63)
> at org.seasar.dbflute.bhv.core.execution.SelectCBExecution.execute(SelectCBExecution.java:74)
> at org.seasar.dbflute.bhv.core.BehaviorCommandInvoker.executeSql(BehaviorCommandInvoker.java:320)
> at org.seasar.dbflute.bhv.core.BehaviorCommandInvoker.dispatchInvoking(BehaviorCommandInvoker.java:174)
> at org.seasar.dbflute.bhv.core.BehaviorCommandInvoker.invoke(BehaviorCommandInvoker.java:140)
> at org.seasar.dbflute.bhv.AbstractBehaviorReadable.invoke(AbstractBehaviorReadable.java:923)
> at jp.co.kyuden.cnets.batch.sample.TestDao2Batch.execute(TestDao2Batch.java:76)
> at com.anygis.ri.client.startup.StartupUtils.runApplications(StartupUtils.java:302)
> at com.anygis.ri.client.startup.StartupUtils.runBatchApplication(StartupUtils.java:116)
> at com.anygis.ri.client.batch.DefaultBatchApplication.run(DefaultBatchApplication.java:137)
> at com.anygis.ri.client.batch.AnyGISBatchApplication.<init>(AnyGISBatchApplication.java:57)
> at com.anygis.ri.client.batch.AnyGISBatchApplication.main(AnyGISBatchApplication.java:31)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
> at java.lang.reflect.Method.invoke(Unknown Source)
> at com.anygis.components.client.BatchApplication.main(BatchApplication.java:39)
> Caused by: java.sql.SQLException: 列名が無効です。
> at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
> at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
> at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
> at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:3296)
> at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:1914)
> at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:1515)
> at org.seasar.dbflute.s2dao.valuetype.registered.StringType.getValue(StringType.java:42)
> at org.seasar.dbflute.s2dao.extension.TnRowCreatorExtension.getValue(TnRowCreatorExtension.java:169)
> at org.seasar.dbflute.s2dao.extension.TnRowCreatorExtension.createRow(TnRowCreatorExtension.java:124)
> at org.seasar.dbflute.s2dao.rshandler.TnAbstractBeanMetaDataResultSetHandler.createRow(TnAbstractBeanMetaDataResultSetHandler.java:85)
> at org.seasar.dbflute.s2dao.rshandler.TnBeanListMetaDataResultSetHandler.mappingBean(TnBeanListMetaDataResultSetHandler.java:108)
> at org.seasar.dbflute.s2dao.rshandler.TnBeanCursorMetaDataResultSetHandler.handle(TnBeanCursorMetaDataResultSetHandler.java:56)
> at org.seasar.dbflute.s2dao.sqlhandler.TnBasicSelectHandler.execute(TnBasicSelectHandler.java:91)
> at org.seasar.dbflute.s2dao.sqlhandler.TnBasicSelectHandler.execute(TnBasicSelectHandler.java:75)
> ... 21 more
>
>
> ※1:Select文(カーソルオープン)
> ※2:Insert文(testYyyXxxBhv.insert(dt);)
> ※3:※1と同様のSQL
>
>
>
> 以上.長文で申し訳ございません.
>
>
>
>
>
>
>
>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
>
Seasar-user メーリングリストの案内