- PR -

Hibernate&Springの宣言的トランザクション管理について

1
投稿者投稿内容
hiro
常連さん
会議室デビュー日: 2004/09/02
投稿数: 21
投稿日時: 2004-09-14 20:05
現在、Hibernate&Springを利用したO/Rマッピングのアプリを開発しているのですが、
AOPによる宣言的トランザクション管理がうまく機能していません。

事象としては以下の通りです。

1.DAOクラスのスーパークラスにDAOBaseクラスを利用
2.HibernateDaoSupportクラスをDAOBaseが継承
3.DAOBaseクラス内に、saveOrUpdate,deleteなどのメソッドをオーバーライド
4.DAOインターフェイスでDAOBaseインターフェイスを継承
5.個々のDAOクラスおよび業務アプリでDAOBaseのメソッドを利用しデータ更新
6.アプリケーションコンテキストファイルに各DAOクラスのメソッドに対する伝播レベルを指定

上記のような状態で、6番の定義が以下の通りであるとき
<bean id="customerDAO"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
:
:
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="save*">PROPAGATION_REQUIRED,-java.lang.Exception</prop>
<prop key="customer*">PROPAGATION_REQUIRED,-java.lang.Exception</prop>
</props>
</property>
</bean>

この状態でCustomerDAO.customerInsert()のメソッド内でthis.saveOrUpdate(customer)を実行した後にExceptionを発生させたところ、DBへのInsertが成功してしまいます。
ここで実際は、「-java.lang.Exception」の記述によりトランザクションがロールバックされInsertが実施されないことを望んでいます。
「save*」「customer*」の伝播レベルをいろいろ変更はしてみたのですがうまくいきません。
また、継承先のsaveOrUpdateメソッドを利用していることに問題があるのかと思い、customerInsert()内で直接HibernateDaoSupportのsaveOrUpdateを実行してみたのですが結果は同様でした。
customerInsert()のレベルをPROPAGATION_NOT_SUPPORTED等に変更するとInsertは実行されないので宣言的トランザクション管理自身はうまく言っているように思えます。

どなたか参考になる事例等があれば教えていただきたいです。
よろしくお願いします。

[ メッセージ編集済み 編集者: hiro 編集日時 2004-09-17 17:44 ]
lombroso
会議室デビュー日: 2002/12/18
投稿数: 4
投稿日時: 2004-09-29 01:51
こんにちは。
|この状態でCustomerDAO.customerInsert()のメソッド内でthis.saveOrUpdate(customer)を
|実行した後にExceptionを発生させたところ、DBへのInsertが成功してしまいます。
「実行した後」のExceptionではすでにトランザクションが完結していますね。
saveOrUpDateメソッドの「中」で例外を発生させてみては。
1

スキルアップ/キャリアアップ(JOB@IT)