S2Hibernate-JPA を使うと何がうれしいか

S2Hibernate-JPA を使った簡単なサンプルを日記で書いてみようと思います。

と、その前に、S2Hibernate-JPAを使うと何がうれしいのかについてちょっとだけ説明してみます。ひと言で言うと...

EJB3コンテナを使わなくても EntityManager を DI して利用できる。

ということになります。
よく、ドキュメントなどで、EJB3を使わない環境ではこんな感じでJPAを利用できますよとあります。

public class HogeDaoImpl implements HogeDao {
  public void hoge() {
    EntityManagerFactory emf = Persistence
        .createEntityManagerFactory("Order");
    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();
    // ...
    em.getTransaction().commit();
    em.close();
    // ...
    emf.close (); // アプリケーション終了時にはclose
  }
}

自分でEntityManagerを取得してライフサイクルをコントロールしたり、トランザクションの制御をしたりとなんかあんまりうれしくないです。でも、S2Hibernate-JPAを使うとこう書けます。

public class Hoge implements HogeDao {

  private EntityManager em;

  public void setEntityManager(EntityManager em) {
    this.em = em;
  }

  public void hoge() {
    // ...
  }
}

EntityManagerをDIできたり、トランザクションのコードを書く必要がなくなったりとすっきりします。DIやトランザクションはS2コンテナが担当してくれるからです。また、EntityManagerFactoryはそもそも使う必要がないですし、EntityManagerをcloseする必要もなくなります。これらもS2コンテナが調整してくれます。
したがって、コードはEJB3JPAを使うときとほとんど一緒になります(@Statelessや@PersistenceContextがないだけ)。
DaoやLogicではSeasarAPIを使う必要はまったくありません。あまり重要ではないかもしれませんが、たとえEJB3で動かしたくなってもすぐ対応できます。

ちなみにここに書いたことはS2Hibernate-JPAだけでなく、S2TopLink-JPAにもそのまま当てはまります。S2Hibernate-JPAS2TopLink-JPAが提供する機能はほとんど同じです。違いはJPAの実装に関連するものだけと言えます。

実際のサンプルはのちほど...