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