1.3. パート3 - EventManager Web アプリケーション

Hibernate の Web アプリケーションは、 スタンドアロンのアプリケーションのように SessionTransaction を使用します。しかし、一般的なパターンも一部便利です。 ここで EventManagerServlet を作成します。 このサーブレットは、 データベースに格納した全イベントを一覧表示でき、 新しいイベントを入力するため HTML フォームを提供します。

1.3.1. 基本的な Servlet の記述

最初に、 基本的なプロセスサーブレットを作成する必要があります。 サーブレットは HTTP の GET リクエストのみを処理するため、 doGet() メソッドのみを実装します。
package org.hibernate.tutorial.web;

// Imports

public class EventManagerServlet extends HttpServlet {

    protected void doGet(
            HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        SimpleDateFormat dateFormatter = new SimpleDateFormat( "dd.MM.yyyy" );

        try {
            // Begin unit of work
            HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction();

            // Process request and render page...

            // End unit of work
            HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().commit();
        }
        catch (Exception ex) {
            HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().rollback();
            if ( ServletException.class.isInstance( ex ) ) {
                throw ( ServletException ) ex;
            }
            else {
                throw new ServletException( ex );
            }
        }
    }

}
このサーブレットを src/main/java/org/hibernate/tutorial/web/EventManagerServlet.java として保存します。
ここで適用されるパターンは session-per-request (リクエスト毎のセッション) と呼ばれます。 サーブレットがリクエストを受け取ると、 SessionFactorygetCurrentSession() への最初の呼び出しにより、 新しい Hibernate の Session が開かれます。 その後、 データベースのトランザクションが開始されます。 データの読み書きに関わらず、 すべてのデータアクセスはトランザクション内で発生します。 アプリケーションで自動コミットを使用しないでください。
全データベース操作で新しい Hibernate Session を使用 しないでください 。全てのリクエストで機能する、1つの Hibernate Session を使用してください。自動的に現在の Java スレッドにバインドされるので、getCurrentSession() を使用してください。
次に、 リクエストの可能なアクションは処理され、 HTML の応答がレンダリングされます。 これについては後ほど説明します。
最後に、 処理とレンダリングが完了した時に作業単位を終了します。 処理中やレンダリング中に問題が発生した場合、 例外がスローされ、 データベーストランザクションがロールバックされます。 これにより、 session-per-request パターンが完了します。 全てのサーブレットにトランザクション境界のコードを書く代わりに、 サーブレットフィルタに記述することも可能です。 Open Session in View と呼ばれるこのパターンについては、 Hibernate の Web サイトや Wiki を参照してください。 サーブレットではなく JSP でビューのレンダリングを考慮している場合、 すぐにこのパターンについての情報が必要になるでしょう。