[Seasar-user:12086] [DBFlute]トランザクションが開始できない

Shibuya [E-MAIL ADDRESS DELETED]
2007年 12月 13日 (木) 17:01:14 JST


お世話になっております。Shibuyaと申します。

現在、s2daoおよびdbfluteを用いたwebシステムを作成しております。

その中で、トランザクション管理を行いたいと考えているのですが、
トランザクションを開始することができず、管理を行うことができません。

以下に、現状を記載いたします。

----------------------------------------
【環境】

S2.4.18-rc1
s2-dao-1.0.47-RC1
dbflute-0.5.7

Oracle 10g
Tomcat6.0
Windows XP


----------------------------------------
【現象】

・初期化時に、「transactionControlが見つからない」とのWARNINGが出力される
・検索処理を実行しようとすると、RequiredInterceptor.invoke で
NullPointerExceptionが発生
・aspectをコメントアウトして、connectionPoolタグのallowLocalTxプロパティ
をfalseにしたところ、
 「org.seasar.framework.exception.SIllegalStateException: [ESSR0311]ト
ランザクションが開始されていません」という例外が発生


----------------------------------------
【ログ】

--------------------
■ 起動時

DEBUG - S2Containerを作成します。path=app.dicon
DEBUG - S2Containerを作成します。path=app_bl.dicon
DEBUG - S2Containerを作成します。path=dbflute.dicon
DEBUG - S2Containerを作成します。path=j2ee-oracle.dicon
DEBUG - S2Containerを作成しました。path=j2ee-oracle.dicon
DEBUG - S2Containerを作成しました。path=dbflute.dicon
DEBUG - S2Containerを作成しました。path=app_bl.dicon
DEBUG - S2Containerを作成しました。path=app.dicon
WARN - org.seasar.extension.tx.RequiredInterceptorのプロパティ
(transactionControl)が見つからないので設定をスキップします
WARN - org.seasar.extension.tx.RequiresNewInterceptorのプロパティ
(transactionControl) が見つからないので設定をスキップします
WARN - org.seasar.extension.tx.MandatoryInterceptorのプロパティ
(transactionControl)が見つからないので設定をスキップします
WARN - org.seasar.extension.tx.NotSupportedInterceptorのプロパティ
(transactionControl)が見つからないので設定をスキップします
INFO - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * {DBFlute}
… (略) …

--------------------
■ 検索処理実行時

ERROR - InvocationTargetException : java.lang.NullPointerException
java.lang.NullPointerException
at
org.seasar.extension.tx.RequiredInterceptor.invoke(RequiredInterceptor.java:41)
at
xxx.dao.dbflute.exbhv.HogeMstrBhv$$EnhancedByS2AOP$$1445748$$MethodInvocation$$selectPage9.proceed(MethodInvocationClassGenerator.java)
at
xxx.dao.dbflute.exbhv.HogeMstrBhv$$EnhancedByS2AOP$$1445748.selectPage(HogeMstrBhv$$EnhancedByS2AOP$$1445748.java)
at
xxx.business.office.office.officeSelect.HogeSelectBL.executeSearch(HogeSelectBL.java:99)
at
xxx.business.office.office.officeSelect.HogeSelectAction.doReady(HogeSelectAction.java:56)
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)
… (略) …

--------------------
■ 検索処理実行時 (aspectコメントアウト時)

DEBUG -
/================================================================================
DEBUG - HogeMstrDao.selectCount()
DEBUG - ==========================/
DEBUG - HogeSelectAction.doReady():56 --> HogeMstrBhv.selectCount() --> ...
ERROR - InvocationTargetException :
org.seasar.framework.exception.SIllegalStateException: [ESSR0311]トラン
ザクションが開始されていません
org.seasar.framework.exception.SIllegalStateException: [ESSR0311]トラン
ザクションが開始されていません
at
org.seasar.extension.dbcp.impl.ConnectionPoolImpl.checkOut(ConnectionPoolImpl.java:243)


----------------------------------------
【dicon】

--------------------
■ app.dicon

<components>
<include path="app_bl.dicon"/>
</components>

--------------------
■ app_bl.dicon

<components>
<include path="dbflute.dicon"/>

<component class="xxx.business.HogeSelectBL">
<aspect pointcut="execute.*">j2ee.requiredTx</aspect>
</component>
</components>

--------------------
■ dbflute.dicon

<components namespace="dbflute">
<include path="j2ee-oracle.dicon"/>

<!-- S2Dao component. -->
<component class="org.seasar.dao.impl.AnnotationReaderFactoryImpl"/>
<component class="org.seasar.dao.impl.ValueTypeFactoryImpl"/>

<component class="xxx.dao.dbflute.allcommon.s2dao.S2DaoMetaDataFactoryImpl">
<property name="sqlFileEncoding">"UTF-8"</property>
</component>

<component name="interceptor"
class="xxx.dao.dbflute.allcommon.s2dao.S2DaoInterceptor"/>

<component
class="xxx.dao.dbflute.allcommon.s2dao.S2BeanMetaDataFactoryImpl"/>
<component class="org.seasar.dao.impl.DaoNamingConventionImpl"/>
<component class="org.seasar.dao.impl.NullBeanEnhancer"/>
<component
class="xxx.dao.dbflute.allcommon.s2dao.S2DaoMetaDataExtension$ResultSetHandlerFactoryExtension"/>
<component class="org.seasar.dao.impl.DtoMetaDataFactoryImpl"/>
<component
class="xxx.dao.dbflute.allcommon.s2dao.S2DaoPropertyTypeFactoryBuilderExtension"/>
<component
class="org.seasar.dao.impl.RelationPropertyTypeFactoryBuilderImpl"/>
<component class="org.seasar.dao.impl.DefaultTableNaming"/>
<component class="org.seasar.dao.impl.DefaultColumnNaming"/>
<component class="org.seasar.dao.impl.ProcedureMetaDataFactoryImpl"/>
<component class="xxx.dao.dbflute.allcommon.s2dao.S2DaoLatestSqlProvider"/>

<!-- Behavior selector. -->
<component name="behaviorSelector"
class="xxx.dao.dbflute.allcommon.CacheBehaviorSelector">
<destroyMethod name="destroy"/>
</component>

<!-- Dao selector. -->
<component name="daoSelector"
class="xxx.dao.dbflute.allcommon.CacheDaoSelector">
<destroyMethod name="destroy"/>
</component>

<!-- The dao of outside-sql. -->
<component class="xxx.dao.dbflute.allcommon.cbean.outsidesql.OutsideSqlDao">
<aspect>dbflute.interceptor</aspect>
</component>

<!-- Original dao component. -->

<!-- Original behavior aspect. -->

<!-- HOGE_MSTR -->
<component name="hogeMstrDao" class="xxx.dao.dbflute.exdao.HogeMstrDao">
<aspect pointcut=".*">dbflute.interceptor</aspect>
<aspect
pointcut="insert.*,update.*,delete.*,select.*">j2ee.requiredTx</aspect>
</component>

<component name="hogeMstrBhv" class="xxx.dao.dbflute.exbhv.HogeMstrBhv">
<aspect
pointcut="insert.*,update.*,delete.*,select.*">j2ee.requiredTx</aspect>
</component>

… (略) …
</components>

--------------------
■ j2ee-oracle.dicon

<components namespace="j2ee">
<component name="transactionManager"
class="org.seasar.extension.jta.TransactionManagerImpl"/>
<component name="requiredTx"
class="org.seasar.extension.tx.RequiredInterceptor"/>
<component name="requiresNewTx"
class="org.seasar.extension.tx.RequiresNewInterceptor"/>
<component name="mandatoryTx"
class="org.seasar.extension.tx.MandatoryInterceptor"/>
<component name="notSupportedTx"
class="org.seasar.extension.tx.NotSupportedInterceptor"/>

<component class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>
<component class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/>

<component name="xaDataSource"
class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
<property name="driverClassName">
"oracle.jdbc.driver.OracleDriver"
</property>
<property name="URL">
"jdbc:oracle:thin:@xxxx"
</property>
<property name="user">"user"</property>
<property name="password">"password"</property>
</component>

<component name="connectionPool"
class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
<property name="timeout">600</property>
<property name="maxPoolSize">10</property>
<!-- JTAトランザクションが開始されていない場合にコネクションを
取得できないようにするには次のプロパティをfalseにしてください.-->
<property name="allowLocalTx">true</property>
<destroyMethod name="close"/>
</component>
<component name="dataSource"
class="org.seasar.extension.dbcp.impl.DataSourceImpl"/>
</components>

----------------------------------------


最終的な目標は、1回のsubmit処理で複数テーブルに対する登録処理を実行する
ことです。
例外発生時にはすべての登録処理をrollbackする必要があるため、トランザク
ション管理を行いたいのです。

dbflute を使用せず、s2daoのみで構築したプロジェクトも作成しましたが、
そちらは正常にトランザクション管理を行うことができました。
上記にあげた、j2ee-oracle.dicon は、その際に作成したdiconです。
同じdiconを流用するだけでは、トランザクション管理は行えないのでしょうか。

お手数をおかけして申し訳ありませんが、
お気づきの点等ございましたらご教授いただけませんでしょうか。
また、不備・不足情報等ありましたらご指摘ください。

どうぞよろしくお願いいたします。



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