Java EE 7のトランザクション管理(JTA)概要
以前、MVC 1.0の記事で、Java EEのトランザクション管理について書きました。
MVC 1.0ではじめる簡単Java EE開発入門! - Java EE 事始め!
@RequestScoped public class ManufacturerService { @PersistenceContext(unitName = "ozarkPU") private EntityManager manager; @Transactional(Transactional.TxType.REQUIRED) // JTAトランザクション管理 public Manufacturer findById(Integer id) { Manufacturer manufacturer = manager.find(Manufacturer.class, id); return manufacturer; } }
JTAについては、@den2snさんが以前にブログに書いていらっしゃいましたので、詳しいことはこちらをご参照ください。
Java EE 7のTransactionalアノテーションを試してみる - DENの思うこと
要約すると、こんな感じです。
- メソッド内で非チェック例外(RuntimeExceptionおよびそのサブクラス)が発生すると、ロールバックされる
- メソッド内でチェック例外(RuntimeExceptionおよびそのサブクラスでない例外)が発生すると、ロールバックされない
- @TransactionアノテーションのrollbackOn属性に例外クラス(チェック例外・非チェック例外に関わらず)を指定すると、その例外が発生時にロールバックされる
少し、@den2snさんの記事の補足をします。
最後のほうに、GlassFishのバグとして、rollbackOn = Exception.classと指定しても、そのサブクラスのClassNotFoundExceptionを発生させてもロールバックされない、という現象が書かれていました。
ブログの日付を見る限りでは、@den2snさんはおそらくGlassFish 4.0で試されていたものと思われます。
今回、僕が同様の実験をGlassFish 4.1で行ったところ、このバグは直っていました。
GlassFish 4.1は正しく動きます。
簡単ですが、今回はここまで。