トップ 一覧 ヘルプ RSS ログイン

HibernateIntegrationの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!Hibernateとの連携

!!概要

ClickではHibernateとの連携のためにClick Extrasにおいて以下のクラスを提供しています。

*[HibernateForm|http://click.sourceforge.net/docs/extras-api/net/sf/click/extras/hibernate/HibernateForm.html] - Hibernateのエンティティオブジェクトに編集フォームを提供するためのFormコントロールの拡張。
*[SessionContext|http://click.sourceforge.net/docs/extras-api/net/sf/click/extras/hibernate/SessionContext.html] - HibernateのSessionを取得するためのクラス。SessionFilterで初期化する必要があります。
*[SessionFilter|http://click.sourceforge.net/docs/extras-api/net/sf/click/extras/hibernate/SessionFilter.html] - HibernateのSessionを初期化するためのサーブレットフィルタ。

それでは利用方法を順番に見て行きましょう。

!!SessionFilterの設定

SessionContextの初期化およびリクエストごとのセッションのクローズを行います。web.xmlで以下のように設定し、ClickServletにフィルタを適用します。

 <web-app>
   <filter>
     <filter-name>session-filter</filter-name>
     <filter-class>net.sf.click.extras.hibernate.SessionFilter</filter-class>
   </filter>
 
   <filter-mapping>
     <filter-name>session-filter</filter-name>
     <servlet-name>click-servlet</servlet-name>
   </filter-mapping>
 
   <servlet>
     <servlet-name>click-servlet</servlet-name>
   ..
 </web-app> 
{{code xml
<web-app>
  <filter>
    <filter-name>session-filter</filter-name>
    <filter-class>net.sf.click.extras.hibernate.SessionFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>session-filter</filter-name>
    <servlet-name>click-servlet</servlet-name>
  </filter-mapping>

  <servlet>
    <servlet-name>click-servlet</servlet-name>
  ..
</web-app> 
}}

!!SessionContextの使用

SessionContextはデフォルトではクラスパスのルートに存在するhibernate.cfg.xmlをHibernateの設定ファイルとして使用しますが、システムプロパティを使用して初期化を行うことも可能です。SessionContextの初期化コードは以下のようになっています。

 Configuration configuration = new Configuration();
 configuration.setProperties(System.getProperties());
 configuration.configure();
 SessionFactory sessionFactory = configuration.buildSessionFactory(); 
{{code java
Configuration configuration = new Configuration();
configuration.setProperties(System.getProperties());
configuration.configure();
SessionFactory sessionFactory = configuration.buildSessionFactory(); 
}}

SessionContextからは[getSession()|http://click.sourceforge.net/docs/extras-api/net/sf/click/extras/hibernate/SessionContext.html#getSession()]というstaticメソッドでHibernateのSessionオブジェクトを取得することができます。SessionはSessionContextの内部においてスレッドごとに管理されており、SessionFilterによってリクエスト処理の終了時に自動的にクローズされます。

!!HibernateFormの使用

HibernateFormはHibernateのエンティティオブジェクトから自動的に入力フォームを生成します。必須のプロパティに関してはフィールドのrequiredプロパティが自動的にtrueに設定されます。

以下の例はUserオブジェクトを生成/更新するためのページです。既存のUserオブジェクトを編集する場合、編集対象のオブジェクトをリクエストパラメータとして渡します。それ以外の場合は[saveChanges()|http://click.sourceforge.net/docs/extras-api/net/sf/click/extras/hibernate/HibernateForm.html#saveChanges()]メソッドの呼び出しで新しいUserオブジェクトが作成されます。

 public class UserEdit extends Page {
 
{{code java
public class UserEdit extends Page {

   private HibernateForm form = new HibernateForm("form", User.class);
 
    public UserEdit() {
        form.add(new TextField("firstName");
        form.add(new TextField("middleNames");
        form.add(new TextField("FamilyName");
 
        form.add(new Submit("ok", "   OK   ", this, "onOkClicked");
        form.add(new Submit("cancel", this, "onCancelClicked");
 
        form.setButtonAlign("right");
        form.setLabelRequiredPrefix("<b>");
        form.setLabelRequiredSuffix("</b>");
        addControl(form);
    }
 
    public void onGet() {
        User user = (User)getContext().getRequestAttribute("user");
        if (user != null) {
            form.setValueObject(user);
        }
    }
 
    public boolean onOkClicked() {
        if (form.isValid()) {
           if (form.saveChanges()) {
               setRedirect("user-list.htm");
           }
        }
        return true;
    }
 
    public boolean onCancelClicked() {
        setRedirect("user-list.htm");
        return false;
    }
 }

   public UserEdit() {
       form.add(new TextField("firstName");
       form.add(new TextField("middleNames");
       form.add(new TextField("FamilyName");

       form.add(new Submit("ok", "   OK   ", this, "onOkClicked");
       form.add(new Submit("cancel", this, "onCancelClicked");

       form.setButtonAlign("right");
       form.setLabelRequiredPrefix("<b>");
       form.setLabelRequiredSuffix("</b>");
       addControl(form);
   }

   public void onGet() {
       User user = (User)getContext().getRequestAttribute("user");
       if (user != null) {
           form.setValueObject(user);
       }
   }

   public boolean onOkClicked() {
       if (form.isValid()) {
          if (form.saveChanges()) {
              setRedirect("user-list.htm");
          }
       }
       return true;
   }

   public boolean onCancelClicked() {
       setRedirect("user-list.htm");
       return false;
   }
}
}}

HibernateFormはオブジェクトのINSERTおよびUPDATEをサポートしています。また、内部ではSessionContext#getSession()メソッドを使用してHibernateのセッションを取得していますが、HibernateFormのgetSession()メソッドをオーバーライドすることでSessionContextを使わないようにすることも可能です。