読者です 読者をやめる 読者になる 読者になる

Java EE 事始め!

主にJava EEについて、つらつらとマイペースに書いていきます。「Java EEを勉強するときに、一番最初に読んでもらえるブログ」を目指して頑張ります!

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の思うこと


要約すると、こんな感じです。

  1. メソッド内で非チェック例外(RuntimeExceptionおよびそのサブクラス)が発生すると、ロールバックされる
  2. メソッド内でチェック例外(RuntimeExceptionおよびそのサブクラスでない例外)が発生すると、ロールバックされない
  3. @TransactionアノテーションのrollbackOn属性に例外クラス(チェック例外・非チェック例外に関わらず)を指定すると、その例外が発生時にロールバックされる

少し、@den2snさんの記事の補足をします。
最後のほうに、GlassFishのバグとして、rollbackOn = Exception.classと指定しても、そのサブクラスのClassNotFoundExceptionを発生させてもロールバックされない、という現象が書かれていました。
ブログの日付を見る限りでは、@den2snさんはおそらくGlassFish 4.0で試されていたものと思われます。

今回、僕が同様の実験をGlassFish 4.1で行ったところ、このバグは直っていました。
GlassFish 4.1は正しく動きます。

簡単ですが、今回はここまで。