EJB3でセッションビーンが簡単に作れることがわかった!
ということで、今度はトランザクションの動きについてみてみる。
とりあえず、何も考えずに素のトランザクションの動きは、何もおきずに正常終了するとコミット。検査例外もコミット。非検査例外はロールバック。という動きになるみたい。
とりあえず、NetBeansにデフォルトでついてくるSampleデータベースのCustomerテーブルに更新をかけるセッションビーンを作ってみた。
@Stateless
public class TransactionTestBean implements TransactionTestLocal {
@PersistenceContext
private EntityManager entityManager;
public void update(int id, String name, boolean isThrow) {
Customer customer = entityManager.find(Customer.class, id);
if (customer != null) {
// customerのnameを更新
customer.setName(name);
}
if (isThrow) {
// 第三引数がtrueの場合は例外発生
throw new RuntimeException("エラーじゃ");
}
}
}
第三引数がtrueだと例外が飛ぶ仕組み。
これを呼ぶための画面を適当にこさえて実験!!
textFieldIDのvalueをcusomerIDプロパティにバインドして、textFieldNameをcustomerNameプロパティにバインドしています。ボタンは、更新がbutton1で更新(失敗)がbutton2です。
各々のボタンのアクションに下のようなコードを書いてみた。
@EJB
private TransactionTestLocal transactionTest;
public String button1_action() {
transactionTest.update(customerId, customerName, false);
info("更新成功");
return null;
}
public String button2_action() {
try {
transactionTest.update(customerId, customerName, true);
} catch (EJBException ex) {
error(ex.getMessage());
}
return null;
}
実行前にCUSTOMERテーブルの中身をチェック!
ID:1の人はJumboComさん。メモメモ。ということで、実行!
まずは、更新ボタンを押してみる。
JumboComさんの名前が更新されてる。次は、更新(失敗)を押してみる。
(下の更新成功メッセージは、更新ボタンを押したときのもの)
ぽちっとな。
ちゃんと更新されずにロールバックされている。
何も考えなくてもトランザクションの面倒を見てくれてる。
設計するときは、基本的にこの形にはまるように設計すると楽が出来そうだ。