[Seasar-user:11884] Re: [Seasar]Seasar2.4系でトランザクションを扱うための設定

Mitsutaka Sato [E-MAIL ADDRESS DELETED]
2007年 12月 3日 (月) 17:31:44 JST


佐藤と申します。
いつもお世話になっております。

だいぶ昔のネタで、しかもDaoにTransaction境界を設けるなんて〜という流れの中、
ちょっとだけ確認したいことがありましたので教えてください^^;

DaoにTxをAspectする場合、

<component class="...Dao">
 <aspect>j2ee.requiredTx</aspect>
 <aspect>dao.interceptor</aspect>
</component>

とするということでしたが、dao.intercepterとj2eerequiredTxの順番を逆にすると、Txが機能しませんでした。

<component class="...Dao">
 <aspect>dao.interceptor</aspect>
 <aspect>j2ee.requiredTx</aspect>
</component>

ここはやはり、Txから先に書かないと行けない仕様となっているのでしょうか?


On Jun 5, 2007 3:30 PM, Koichi Kobayashi <[E-MAIL ADDRESS DELETED]> wrote:

> 小林 (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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: http://ml.seasar.org/archives/seasar-user/attachments/20071203/d3ce35af/attachment-0001.html 


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