• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Hibernate&Springによる宣言的トランザクション管理)

Hibernate&Springによる宣言的トランザクション管理

このQ&Aのポイント
  • Hibernate&Springを利用したアプリの宣言的トランザクション管理がうまく機能しない
  • 特集5のサンプルを実行してもトランザクションが思った通りに機能しない
  • テスト方法や情報提供を求めている

質問者が選んだベストアンサー

  • ベストアンサー
  • s2t
  • ベストアンサー率79% (47/59)
回答No.1

サンプルのcustomerDAOを確認してみました。 トランザクションはこの場合、customerDAOのメソッド内で有効となります。 つまり、あなたの使い方では customerDAO.saveOrUpdate(customer); を実行時に、内部でエラーが発生するとrollbackされるということです。 あなたが想像している動作をさせるには、applicationContext.xmlに以下を追加して <bean id="customerService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"><ref local="transactionManager"/></property> <property name="target"><ref local="customerServiceTarget"/></property> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean id="customerServiceTarget" class="net.hoge.CustomerServiceImpl"> <property name="customerDAO"><ref local="customerDAO"/></property> </bean> 以下のような感じでクラスを作成します。 -- CustomerService.java package net.hoge; public interface CustomerService { public void doTest() throws Exception; public void doTestRollback() throws Exception; } -- CustomerServiceImpl.java package net.hoge; import jp.programmers.pizza.model.Customer; import jp.programmers.pizza.dao.CustomerDAO; public class CustomerServiceImpl implements CustomerService { private CustomerDAO customerDAO; public void doTest() throws Exception { Customer customer = new Customer(); customer.setName("hoge"); customer.setAddress("hage"); customer.setPhone("117"); customerDAO.saveOrUpdate(customer); } public void doTestRollback() throws Exception { Customer customer = new Customer(); customer.setName("fuga"); customer.setAddress("fugo"); customer.setPhone("177"); customerDAO.saveOrUpdate(customer); throw new Exception(); } public void setCustomerDAO(CustomerDAO customerDAO) { this.customerDAO = customerDAO; } } と、こんな感じでやると、doTest()を実行するとcommitされ、doTestRollback()を実行するとrollbackされているはずです。 今即席で作ったので間違ってるかも知れませんが、イメージ的にはこういうことです。

tama525
質問者

お礼

s2tさん回答ありがとうございます。 早速サンプルを参考にし試しにCustomerDAOImpl.saveOrUpdate()を、以下のように修正してみたところ、思った通りに動作させることが出来ました。私の考え方が少し間違ってたみたいですね。 public void saveOrUpdate(Customer customer) { getHibernateTemplate().saveOrUpdate(customer); getHibernateTemplate().save("test"); } 本当に助かりました。ありがとうございました。

関連するQ&A