現在、下記の書籍を参考にしHibernate&Springを利用したアプリを開発しているのですが、宣言的トランザクション管理がうまく機能していません。
オープンソースJavaプロダクツ
http://www.gihyo.co.jp/books/syoseki-query.php/4 …
試しに、特集5のサンプルを動かしテストしてみたのですが、やはりトランザクションが思った通りに機能しませんでした。
どなたかサンプルを実行した方はいらっしゃいますでしょうか?また、その際トランザクションがちゃんと機能していたか教えていただけないでしょうか?
ちなみにテストの仕方としては、
1
CustomerDAOにてsaveメソッドを定義
2
CustomerImplでオーバーライド
3
save()内でgetHibernateTemplate().save()を実行。その際引数として適当な文字列を渡す。
例 : getHibernateTemplate().save("test")
4
SaveCustomerAction.executeで以下のコードを実行
customerDAO.saveOrUpdate(customer);
customerDAO.save(customer);
この時updateで例外が発生するのでrollbackして欲しいのですが、commitしてしまいます。
テストの仕方もこんなやり方でいいのか?と思いましたが、何か分かる方がいらっしゃいましたら情報の提供よろしくお願い致します。
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されているはずです。
今即席で作ったので間違ってるかも知れませんが、イメージ的にはこういうことです。
s2tさん回答ありがとうございます。
早速サンプルを参考にし試しにCustomerDAOImpl.saveOrUpdate()を、以下のように修正してみたところ、思った通りに動作させることが出来ました。私の考え方が少し間違ってたみたいですね。
public void saveOrUpdate(Customer customer) {
getHibernateTemplate().saveOrUpdate(customer);
getHibernateTemplate().save("test");
}
本当に助かりました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
[C#.net]スレッド化された別フ...
-
コンボボックスを使う時の警告
-
Junitテストでvoid戻り値メッソ...
-
C# タスク非表示でタイトルバー...
-
C#で、あるクラスのメンバーす...
-
GetDIBits関数の使い方について
-
C# 半角カナの文字化けについて
-
Runtime#proccessのwait
-
C# DataGridView列カスタマイズ
-
Javascript @public
-
C#でのWNetAddConnection3の使...
-
ユーザーコントロールを動的に...
-
C# タスクバーを隠したフォーム...
-
struts2のchainで値の受け渡し...
-
配列の受け渡し
-
長方形を描いて、それを移動さ...
-
ボタンの複数割り当てについて
-
JSPやサーブレットでSystem.out...
-
Java配列でNullPointerExceptio...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C#で、あるクラスのメンバーす...
-
C#でのWNetAddConnection3の使...
-
Junitテストでvoid戻り値メッソ...
-
ボタンの複数割り当てについて
-
C# DataGridView列カスタマイズ
-
C# WinForm のDataGridView Cel...
-
C# visibleプロパティをfalseに...
-
[C#.net]スレッド化された別フ...
-
C# 矢印キーの取得
-
unityでのC++エラーの原因がわ...
-
C#から、C++で作成したdll内の...
-
コンボボックスを使う時の警告
-
JavaFXでの表内のチェックボッ...
-
C#で別のFormへ複数の値を返そ...
-
vc++ 2005 Pictureboxの透過処理
-
プログラミング(Java)じゃん...
-
C#でキーイベントが発生しない...
-
正規表現
-
C# MouseHoverを何度も呼ぶには
おすすめ情報