[Seasar-user:8073] Re: [Seasar]Seasar2.4系でトランザクションを扱うための設定
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2007年 6月 5日 (火) 15:30:33 JST
小林 (koichik) です.
回答は JUNDU さんの [Seasar-user:8061] のとおりですが,
ちょっと補足を.
Date: Tue, 05 Jun 2007 09:52:38 +0900
From: kondo <[E-MAIL ADDRESS DELETED]>
To: [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:8052] [Seasar]Seasar2.4系でトランザクションを扱うための設定
> ■customizer.dicon追加設定
> <component name="s2DaoCustomizer"
> class="org.seasar.framework.container.customizer.AspectCustomizer">
> <property name="interceptorName">"j2ee.requiredTx"</property>
> </component>
Dao にトランザクション境界を設定するのはまったく
オススメできませんが,もしそうするのであれば
Dao に対してトランザクションのインターセプタと
S2Dao のインターセプタの両方を設定する必要があります.
上記の定義だと,トランザクションのインターセプタのみ
適用されて,S2Dao のインターセプタが適用されなく
なってしまいます.
これはちょうど,
<component class="...Dao">
<aspect>j2ee.requiredTx</aspect>
</component>
と書いたのと同じようなことになります.
そのために Dao インタフェースのメソッドに対して
実装 (通常は S2Dao のインターセプタが提供) が
提供されず,
> ■発生した例外(元ネタのリンク先より抜粋)
> java.lang.NoSuchMethodError
ということになります.
上記の代わりに
<component name="daoCustomizer"
class="org.seasar.framework.container.customizer.CustomizerChain">
<initMethod name="addCustomizer">
<arg>requiredTxCustomizer</arg>
</initMethod>
<initMethod name="addCustomizer">
<arg>s2DaoCustomizer</arg>
</initMethod>
</component>
とすることで,Dao にトランザクションと S2Dao の
両方のインターセプタが適用されるようになります.
requiredTxCustomizer,s2DaoCustomizer とも
std-customizer.dicon という,s2-framework-2.4.x.jar に
含まれる標準コンポーネントです.
std-customizer.dicon は通常,default-customizer.dicon
経由で利用します.
これで
<component class="...Dao">
<aspect>j2ee.requiredTx</aspect>
<aspect>dao.interceptor</aspect>
</component>
と書いたのと同じようになります.
このように設定した場合,Dao のメソッドが呼ばれる度に
トランザクションが開始・コミットされてしまうので,
FxUG の ML で nobu さんが書いておられるような
> ※Dao#insertを2回実行し、2回目で例外が発生した場合1回目の分
> もきちんとロールバックされている。
という動きにはなりません.
これを実現するには,JUNDU さんが [Seasar-user:8061] で
書いておられるように,Service 等に対してトランザクション
境界を設定し,Dao は S2Dao のインターセプタのみ適用します.
<component name="serviceCustomizer"
class="org.seasar.framework.container.customizer.CustomizerChain">
<initMethod name="addCustomizer">
<arg>requiredTxCustomizer</arg>
</initMethod>
</component>
<component name="daoCustomizer"
class="org.seasar.framework.container.customizer.CustomizerChain">
<initMethod name="addCustomizer">
<arg>s2DaoCustomizer</arg>
</initMethod>
</component>
これで
<component class="...Service">
<aspect>j2ee.requiredTx</aspect>
</component>
<component class="...Dao">
<aspect>dao.interceptor</aspect>
</component>
と書いたのと同じようになります.
--
<component name="koichik">
<property name="fullName">"Koichi Kobayashi"</property>
<property name="email">"[E-MAIL ADDRESS DELETED]"</property>
<property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>
Seasar-user メーリングリストの案内