[Seasar-user:19301] Re: EntityRowHandler#handle()におけるデータ操作について

kubo [E-MAIL ADDRESS DELETED]
2010年 2月 12日 (金) 18:09:55 JST


久保(jflute)です。

松原さん

DBFlute-0.9.6.5-RC3を出しました。
もし、よければという感じですが、
そちらのプロジェクトで適用してみて頂けないでしょうか?
http://d.hatena.ne.jp/jflute/20100209/1265711451

リリース間近ですが、できればSNAPSHOT以降の修正が
松原さんのプロジェクトでフィットするかどうかを
確認してからリリースしたいなと。

2010/2/8 kubo <[E-MAIL ADDRESS DELETED]>:
> 久保(jflute)です。
>
> 松原さん、ご確認ありがとうございます!
> もろもろ整理したら正式版リリースしますので、
> それまではそのSNAPSHOTバンバン叩いておいて下さい。
>
> 2010/2/8  <[E-MAIL ADDRESS DELETED]>:
>> 久保さま
>>
>> お世話になっております.松原です.
>>
>> 返信が遅くなり,申し訳ございません.
>>
>> ご提供頂いた,「DBFlute-0.9.6.5-SNAPSHOT」で,
>> 問題なく動作致しました.
>> また,当プロジェクトは開発中ですので,アップグレード可能です.
>>
>> 申し訳ございませんが,正式版への適用を宜しくお願い致します.
>>
>> 以上です.
>>
>>
>>>久保(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 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 メーリングリストの案内