[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 メーリングリストの案内