Home > Documentation > 4. Apache Geronimo への移行 > 4.6. JBoss to Geronimo - Hibernate の移行 |
この文章は、Hibernate 3.2 を ORM ツールとして利用するアプリケーションを JBoss アプリケーション・サーバー 4.2.1 から Apache Geronimo 2.0 へ移行する手助けとなります。
Hibernate は強力な、高性能なオブジェクト・リレーショナルの永続化とクエリー・サービスです。データベースのフィールドに結びつけられた属性の getter と setter メソッド持つ永続化(POJO)クラスの開発の助けになります。関連・継承・ポリモーフィズム・コンポジション・コレ クションなどのオブジェクト指向の特徴に従うことになります。Hibernate は、ネイティブな SQL、オブジェクト指向検索条件、例示 API などと同じように、移行可能な SQL 表現(HQL)を用いて検索を表現できます。
基本的には、Hibernate は Java クラスとデータベースの表を結びつけます。また、データ検索や検索機構によって、開発時間の短縮につながります。自然と、Java 中間層におけるオブジェクト指向のコード開発ができます。Hibernate のユニークな特徴は、MySQL、Oracle または DB2 など、どのようなデータベースにもアプリケーションが切り替えることができる透過的永続化機構です。Hibernate は Java Swing アプリケーション、Java サーブレット・アプリケーション、または EJB セッション・ビーンを利用するJ2EE アプリケーションなどに利用できます。(今回は、Java サーブレット・アプリケーションを利用します)
移行の手順を明らかにするために、最初にサンプル・アプリケーションを JBoss にデプロイし、その後 Geronimo へ移行します。サンプル・アプリケーションは、オンライン取引アプリケーションです。JDBC の移行手順の説明で既に利用した物です。このアプリケーションでは永続化のために Hibernate を利用するように変更します。
この文章には以下のセクションがあります。
Hibernate は以下のサービスを提供します。
また、とても柔軟であり、さまざまなサービスと組み合わせて利用できます。JBoss、Geronimo ともトランザクション管理とコネクション管理機能を持っているので、この文章では hibernate を O/R マッピング機能のみ利用できるように構成します。一般的に、Hibernate はアプリケーション・サーバーと一緒に利用するように構成します。Hibernate はコネクション・プールの生成と環境の設定に構成ファイルである hibernate.cfg.xml
を必要とします。このファイルにはデータベース・ドライバー、接続 url、SQL 方言(これは利用している RDBMS の仕様)、ユーザー名、パスワード、プールの大きさなどのパラメーターを含みます。また、*.hbm.xml というマッピング用ファイルの場所の定義も含みます。マッピング用ファイルはデータベースの表のフィールドと永続化クラスの属性とを結びつけるものです。
これらのプロパティは Apache Geronimo v2.0 を含めたアプリケーション・サーバーで一般的なものです。
しかし、JBoss(さらに言えば、Hibernate MBean)は、2つのさらなるデプロイメント機構を持っています。
一つ目は Hibernate アーカイブ(HAR ファイル)です。これは Hibernate のすべてのクラスとマッピング・ファイルが含まれる特別なアーカイブである HAR ファイルです。JBoss はこのアーカイブを EAR や WAR ファイルと同じ方法でデプロイします。
もうひとつは、他のアプリケーションのクラスといっしょに、Hibernate のすべてのクラスとマッピング・ファイルを、例えば EAR の中に単にいれることです。Hibernate MBean は個別に構成され、マッピング・ファイルがアプリケーションのすべての JAR を探しかたを指定します。両方のデプロイメント機構とも、手作業で構成することなく、通常必要となるような設定コードを記述することなく、Hibernate オブジェクトをアプリケーションに追加することができます。
構造的には、HAR ファイルは JBoss サービス・アーカイブ(SAR ファイル)に似ています。HAR ファイルは Hibernate クラス・ファイルとマッピング・ファイル(*.hbm.xml)を、Hibernate アプリケーションが生成する必要がある Hibernate MBean の構成の定義を持つ標準の jboss-service.xml
ファイルと一緒に保持します。最新の JBoss 製品では、hibernate-service.xml
という名前にリネームされていますが、同じ構造と目的を持っています。
Hibernate アーカイブはトップレベルのパッケージとして、または EAR ファイルのコンポーネントとしてデプロイすることができます。Hbernate アーカイブは標準の J2EE デプロイメントの形式ではないので、これらをコンテキスト内で利用できるように EAR ファイルに jboss-app.xml
ファイルを記述する必要があります。
以下の表はこれらアプリケーション・サーバーの機能ごとの比較です。
Feature | Apache Geronimo v2.0 | JBoss v4.2.1 |
---|---|---|
コンテナー管理データソース | サポートされています。Hibernate は与えられた JNDI 名のデータソースを利用することができます。アプリケーションと同じスレッドで実行されるからです。 | サポートされています。Hibernate は与えられた JNDI 名のデータソースを利用することができます。 |
JNDI 自動バインディング | サポートされていません。 | サポートされています。プロパティが設定されるとセッション・ファクトリーが JNDI コンテキストに結びつけられます。 |
JTA セッション・バインディング | この機能は導入直後そのままの状態ではサポートされていません。Geronimo トランザクション・マネージャーが利用できるようにルックアップを記述する必要があります。 | 導入直後からサポートされています。Hibernate は JBoss トランザクション・マネージャー向けのルックアップ・クラスを持っています。 |
JMX デプロイメント | 導入直後そのままの状態ではサポートされていません。GBean と Hibernate コネクション・プロバイダー・クラスを記述すれば実装できます。 | サポートされています。Hibernate は JBoss にデプロイできる |
Hibernate アーカイブ (HAR) | サポートされていません。Hibernate クラスは J2EE アーカイブの一部としてデプロイされます。 | サポートされています。HAR は構成とマッピング・ファイルが含まれ、他のサーバーへのデプロイをサポートできるようになります。 |
キャッシング | hibernate のキャッシング機構を利用できます。 | hibernate のキャッシング機構を利用できます。JBoss キャッシュもサポートされています。 |
セッション管理 | サポートされていません。手動でセッションを開く必要があります。 | Hibernate セッション・ライフサイクルは自動的に JTA トランザクションのスコープに結びつけることができます。手動でセッションを開いたり閉じたりする必要がなく、これは JBoss EBJ インターセプターが行います。 |
Hibernate マッピング・ファイル | Hibernate マッピング・ファイルの場所を指定する必要があります。 | HAR デプロイを利用する場合は JBoss は自動的に Hibernate マッピング・ファイルを探しだします。 |
この文章には、JBoss から Geronimo へアプリケーションの移行をデモンストレーションするサンプル・アプリケーションがあります。名前は Online Brokerage です。オンライン取引でユーザーが株の売買を行うシナリオです。このアプリケーションには以下の5つのページがあります。
以下の図は、アプリケーションのフローです。
最初に、ユーザーは Login ページに接続します。ログインページからユーザーはユーザー名とパスワードを入力します。ユーザー名またはパスワードが不正の場合は、アプリケーションは エラーメッセージを表示し、そのログインを拒否します。ユーザー名とパスワードが正確であれば、すべての株についてその時点の株価を見ることができる Available Stocks ページを開きます。
ユーザーは口座にある利用可能な金額に応じて、購入したい株を Buy ボタンをクリックすることで選択します。取引が無事完了すると、Available Stocks ページ が表示され、必要ならばさらに株が購入できます。株の購入に資金が不足していたら、アプリケーションはエラーとなり取引を進めません。エラーメッセージが Available Stocks ページの上部に表示されます。このページには User Info ボタンがあります。これをクリックすると、User Info ページが表示され、ユーザーの詳細情報が表示されます。
Available Stocks ページには、ユーザーが所有するすべての株を確認できる Portfolio へのリンクがあります。このページでは、ユーザーは株と株数を選んで売却することができます。また、User Cash 欄に現在の利用可能な現金の学が表示されています。所有している数より多くの株を売ろうとすると、アプリケーションはエラーになります。エラーメッセージ が同じページ上に表示されます。売却が成功すると、売却金額がユーザーの現金に加算されます。
quantity テキストボックスにはユーザーが持っている特定の会社の株の数量が表示されています。Quantity to Sell 欄では、その会社の株の売りたい数量を入力することができます。売却と購入にはラジオボタンをチェックします。このことは数値を入力した後になされます。 もし quantity to sell テキストボックスが入力されていないか、ラジオボタンがチェックされずに sell ボタンを押すと、必須入力欄が空であるという JavaScript のアラートが表示されます。数量欄に数値以外の文字が入っていると、別のアラートが表示されます。この動き方は、Available Stocks Page と同じようなものです。
新規ユーザーは、login ページで Register ボタンをクリックすることで登録できます。Registration ページでは、ユーザーID、ユーザー名、パスワード、住所と利用可能現金を入力することができます。
Back to Top
オンライン取引サンプル・アプリケーションには、以下のパッケージが含まれます。
オンライン取引には、以下の JSP ページを含みます。
オンライン取引アプリケーションの開発とビルドのツールは以下の通りです。
Ant はピュア Java のビルド・ツールです。war ファイルをビルドし、オンライン取引アプリケーション向けデータベースを作成するために利用されています。Ant は以下の URL からダウンロードできます。
この文章を書いている時点では Hibernate 3.2 が最新の利用可能バージョンです。以下の URL からダウンロードできます。
http://www.hibernate.org
Hibernate に関する他の文章は、以下の URL にあります。
http://hibernate.org/5.html
http://www.hibernate.org/hib_docs/v3/reference/en/html/tutorial.html
Hibernate をダウンロードし、インストールしてください。インストールしたディレクトリーを後ほど <hibernate_home> として参照します。
このアプリケーションのデモンストレーションに利用するデータベースは MySQL です。サンプル・データベース名は adi です。STOCKS、USERS、USERSTOCKS の3つのテーブルも持ちます。各テーブルは以下のフィールドを持ちます。
Table Name | Fields |
---|---|
STOCKS | ID (PRIMARY KEY) |
USERS | USERID (PRIMARY KEY) |
USERSTOCKS | ID (PRIMARY KEY) |
USERSTOCKS テーブルは、各ユーザが所有する株を保存するために利用されます。USER と STOCKS テーブルはユーザーと株の詳細情報を保存するために利用されます。これは単にサンプル・アプリケーションですので、ユーザーの持つ金額の量は、ユーザー登 録時にユーザー自身に入力してもらいます。
このデータベース生成用の DDL は db.sql です。<brokerage_homge>\sql ディレクトリーにあります。
このセクションでは、サンプルの JBoss 環境がどのように、どこにインストールされるかを示すので、貴方はこのシナリオを貴方の実装に合わせることができます。
JBoss のインストール、構成と管理の詳細な説明については、JBoss のドキュメントにあります。JBoss のウェブ・サイトで最新のドキュメントをチェックしてください。
以下のリストはインストールと初期環境の構成を完了させ、サンプル・アプリケーションのデプロイの準備を完了させるまでに必要な一般的なタスクを示します。
run.sh -c <your_server_name>
コマンドを入力し、新しいサーバーを始動してください。この文章でのオンライン取引アプリケーションのビルドと実行のために、ビルド・ツールとアプリケーションが利用するデータベースをインストールし、構成する必要があります。
前述のとおり、このアプリケーションは MySQL データベースを利用しています。次の URL からダウンロードできます。
メモ:貴方の持つ MySQL のバージョンに応じて、MySQL Connector/J のふさわしいバージョン (3.1、5.0、5.1) もダウンロードしてください。
この MySQL コネクターは <JBOSS_HOME>/server/default/lib に置いてください。
MySQL のインストールと構成は、かなり直感的です。MySQL リファレンス・マニュアルは次の URL からダウンロードできます。
http://dev.mysql.com/doc/mysql/en
メモ:簡単に構成するために、私はセキュリティ設定を変更し、root ユーザーに "password" というパスワードをつけました。このユーザー ID とパスワードは後ほどサンプル・アプリケーションからデータベースへ接続する際に利用されます。
MySQL のインスタンスが構成されたら、書庫アプリケーション(訳注:オンライン取引アプリケーションの間違い?)が利用するサンプル・データベースを作ります。コマンド・ラインから以下のコマンドを入力し、MySQL モニターを始動してください。
mysql -u root -ppassword
-p フラグとパスワードとの間にブランク文字がないことに注意してください。
MySQL コマンド・インターフェースが起動すると、以下のような表示になります。
MySQL コマンド・インターフェースから、以下のコマンドを入力し、adi サンプル・データベースを作成してください。
mysql> create database adi;
前述のとおり、オンライン取引アプリケーションのビルドには Apache Ant を利用しています。もしまだ Ant をインストールしていなかったら、そろそろインストールして、 <ant_home>\bin ディレクトリーをシステムの path 変数に追加してください。
Apache Ant は以下の URL からダウンロードできます。
JBoss には Hibernate が同梱されていますので、hibernate とは別に jar をダウンロードする必要はありません。
この文章でのオンライン取引アプリケーションには、アプリケーションのビルドとデータベースの生成に利用できる Ant スクリプトが含まれています。サンプル・アプリケーションを次の URL からダウンロードしてください。Online Brokerage
zip ファイルを解凍すると、brokerage ディレクトリーが作られます。以下、このディレクトリーを <brokerage_home> とします。このディレクトリーで build.properties ファイルを開き、環境に合わせてプロパティを編集してください。以下に例を示します。
Hibernate の jar ファイルのパスが dependency.dir タグで定義されています。Geronimo と JBoss がそれぞれに Hibernate のコピーを持つ必要があることに注意してください。このディレクトリーに、<hibernage_home> ディレクトリーにある hibernate3.jar ファイルをコピーする必要があります。
重要: build.properties ファイルの driver.classpath を設定する際に、スラッシュ "/" を利用することに注意してください。そうしないとコンパイル・エラーになります。
コマンド・プロンプトやシェルで、<brokerage_home> ディレクトリーに移動して、ant コマンドを実行してください。そうすると、<brokerage_home>\jboss-artefact ディレクトリーに war 、har 、ear ファイルをビルドします。ant によってビルドされた war は、JBoss 固有のデプロイメント・ディスクリプターである jboss-web.xml ファイルを WEB-INF ディレクトリーに含みます。HAR ファイルには JBoss 固有の hibernate-service.xml ファイルを META-INF ディレクトリーに含みます。EAR ファイルには JBoss 固有のデプロイメント・ディスクリプターである jboss-app.xml を含みます。これらのファイルについて、以下に例を示します。
resource-ref 要素は、web.xml ファイルにある jdbc/HibernateDB という名前で参照されているリソースと、今回の例での MySQL データ・ソース向けである java:jdbc/HibernateDS という JNDI 名のリソースとを結び付けるために利用されます。
このファイルには設定する必要のある hibernate のプロパティを含んでいます。これらの名称と機能は次のとおりです。
hibernate-service.xml ファイルは EAR(訳注:原文は EAR ですが、HAR では?)の META-INF ディレクトリーの中にあります。
jboss-app.xml ファイルは EAR ファイルの META-INF ディレクトリーの中にあり、har ファイルの名前を記述しています。
以下の例ではこのアプリケーションで利用しているデプロイメント記述である web.xml を示します。web.xml ファイルは brokerage.war ファイルの WEB-INF ディレクトリーにあるデプロイメント記述で、サーブレット名やアプリケーションのデフォルトの JSP などについて記述されています。
前述のとおり、db.sql スクリプトがサンプル・データを生成します。このファイルの場所はすでに build.properties 内で sql.file タグによって定義されています。サンプル・データの生成には、単に <brokerage_home> ディレクトリーで以下のコマンドを実行してください。
ant populateDB
サンプル・アプリケーションをデプロイする前に、このアプリケーションが必要とするデータ・ソースを構成する必要があります。JBoss でデータ・ソースの構成をデプロイするには、<brokerage_home>\plan ディレクトリーにある mysql-ds.xml ファイルを以下のディレクトリーにコピーしてください。
<jboss_home>\server\<your_server_name>\deploy
データベースのデプロイと同様に、JBoss でのオンライン取引アプリケーションのデプロイは、Ant でビルドした brokerage.ear ファイルを以下のディレクトリーにコピーしてください。
<jboss_home>\server\<your_server_name>\deploy
もし JBoss がすでに始動していたら、自動的にアプリケーションがデプロイされ、始動されます。そうでなければ、アプリケーションは次回始動時にデプロイされ、始動されます。
アプリケーションをテストするには、ウェブ・ブラウザーを開き、以下の URL に接続してください。
http://localhost:8080/brokerage
オンライン取引アプリケーションのログイン画面が表示されます。user name 欄に j2ee 、password 欄に password を入力し、login をクリックしてください。以下の図のような available stocks ページが表示されます。アプリケーションは構成され、実行されています。
Back to Top
以下の URL から Geronimo をダウンロードし、インストールしてください。
http://geronimo.apache.org/downloads.html
そこにあるリリース・ノートには、システム要件とインストール、始動方法がが明示されています。以下、この文章では Geronimo のインストール・ディレクトリーを <geronimo_home> とします。
Geronimo でオンライン取引アプリケーションを実行するために、JBoss で利用したものと同じ MySQL データベース を利用します。Geronimo 環境に準備のためにするべき作業は、データ・ソースを構成するだけです。
データ・ソースのデプロイメント・プランで参照可能になるように、MySQL データベースのドライバーを Geronimo リポジトリーにコピーする必要があります。Geronimo リポジトリーは <geronimo_home>/repository ディレクトリにあります。このディレクトリーの中に mysql/jars というディレクトリーを作り、そこへ mysql-connector-java-3.1.14-bin.jar ファイルをコピーしてください。
データ・ソースのデプロイメント・プランを定義する必要があります。簡単になるように、サンプル・アプリケーションにはすでに mysql-geronimo-plan.xml というデプロイメント・プランが <brokerage_home>\plan ディレクトリーの中にあります。以下の例がデプロイメント・プランの中身です。
デプロイメント・プランを作り、ドライバーをコピーしたら、次のステップは実際にデータ・ソースのコネクション・プールをデプロイすることです。もし Geronimo を始動していなければ、以下のコマンドで実行し、始動してください。
<geronimo_home>\bin\geronimo start
データ・ソースのコネクション・プールをデプロイするために、以下のコマンドを実行してください。
<geronimo_home>\bin\deploy --user system --password manager deploy <brokerage_home>\plan\mysql-geronimo-plan.xml ..\repository\org\tranql\tranql-connector-ra\1.3\tranql-connector-ra-1.3.rar
環境によりますが、以下のような確認メッセージが表示されるでしょう。
Apache Geronimo はHARアーカイブ形式をサポートしていないので、今回は全てのクラスをWARアーカイブの中に格納します。このアプリケーションをGeronimoで動かすためにクラスを2つ作成する必要があります。ひとつはGeronimo用のTransactionManagerLookupクラスで、もうひとつはセッション・ファクトリーを入手するためのユーティリティ・クラスHibernateUtilです。 それ以外にTradeDispatcherServlet とTradeDAOクラスに若干の変更を加える必要があります。
手始めに、アプリケーションに加えるべき変更点を下記のリストで眺めてみましょう。
#TradeDAO
#HibernateUtil
#TradeDispatcherServlet
JBoss環境に於いては、HibernateMBeanがグローバルJNDIコンテキストへのセッション・ファクトリーを作成・バインドしてくれます。この機構により、単純なルックアップだけでセッション・ファクトリーを入手できるようになるわけです。セッションはセッション・ファクトリー経由で入手することができます。
}}{{{}TradeDAO.java
は <brokerage_home>/src/com/dev/trade/dao
ディレクトリーに存在します。
Geronimo環境ではセッション・ファクトリーを作成するための新しいユーティリティ・クラス、HibernateUtil classを作成することになります。
このクラスには、セッションを入手するための getCurrentSession()メソッドがあります。
TradeDAO.java
の冒頭の箇所を以下の抜粋に従って修正します。
以下の文字列を探索・置換します。
factory.getCurrentSession()
を
HibernateUtil.getCurrentSession()
で置換します。
9箇所が置換されるはずです。
セッションを入手する方法が、Apache Geronimo上でアプリケーションを動かすためのコード上の相違点の代表的なものです。
既に述べたとおり、このクラスはセッション・ファクトリーを作成し、アプリケーションにHibernateのセッションを提供するために使われます。このクラスのソース・コードは以下のようになります。
HibernateUtil.java
は <brokerage_home>/src/com/dev/trade/util
ディレクトリーに配置します。ご参考までに、このファイルのコピーは既にサンプル・アプリケーションと一緒に提供されています。
このクラスにもセッション・ファクトリーを入手する際の相違点があります。JBossではセッション・ファクトリーの入手はJNDIコンテキスト経由で行いましたが、Geronimoではユーティリティ・クラス経由で行います。
TradeDispatcherServlet.java
は <brokerage_home>/src/com/dev/trade/servlet
ディレクトリーに配置されています。doGetメソッドを以下の例に従って置換してください。
Hibernateは色々なアプリケーション・サーバーようにトランザクション・マネージャーのルックアップ用のクラスを提供しています。残念ながら、Hibernate 3.2はApache Geronimo用のルックアップ用クラスを提供していませんので、自分たちで作らなくてはなりません。Geronimo用のトランザクション・マネージャーのルックアップ・クラスのコードは以下のようになります。
ご参考までに、このクラスは既に <brokerage_home>/TransactionManager
ディレクトリーに配置されています。以下のようなディレクトリー構造を作り、そこに GeronimoTransactionManagerLookup.java
をコピーしてください。
*brokerage_home>/src/org/hibernate/transaction
さて次にHibernateの構成ファイル hibernate-cfg.xml を作る必要があります。このファイルの中に必要なHibernateの構成上の属性を記述します。JBoss環境での hibernate-service.xml
は hibernate-cfg.xml と同じ働きをしている点にご留意ください。ご参考までに、サンプルアプリケーションと共にこのファイルも既に <brokerage_home>/hibrenate
ディレクトリーに提供されています。
各々のプロパティ毎の詳細な機能説明についてはHibernareのマニュアルを参照してください。
ビルド前の最後のステップとして、Geronimo固有のデプロイメント記述子である geronimo-web.xml を作成します。以下の例を参照してください。またご参考までにこのファイルは <brokerage_home>/web/descriptors/geronimo
ディレクトリーに既に提供されています。
<hidden-classes>
エレメントは、warクラスローダーがクラス探索時にApache Geronimoの提供クラスを参照してしまうことで発生するかもしれないバーション不一致の問題を回避するための指定です。
サンプル・アプリケーションをビルドするには以下のコマンドを実行します。
GeronimoTransactionManagerLookup
クラスはhibernate と共にビルドする必要があります。貴方がHibernateのソースコードをダウンロードしていないとしても、hibernate jarをクラスパスに追加すればクラスをコンパイルできるようになります。その後、コンパイルしたクラスをhibernate jarファイルに追加します。set CLASSPATH=%CLASSPATH%;<hibernate_home>/lib/hibernate3.jar
set CLASSPATH=%CLASSPATH%;<geronimo_home>/lib/geronimo-kernel-2.0.1.jar
<hibernate_home>/lib/hibernate3.jar
ファイルの中の org\hibernate\transaction
ディレクトリーに追加してください。<brokerage_home>/ant war
今回のオンライン仲介サンプル・アプリケーションは単なるWebアプリケーションなので war ターゲットを使っています。JBossのセクションではwarとharをパッケージするためにear形式を使いましたが、har形式はGeronimoではサポートされていません。
実行の結果、<brokerage_home>/geronimo-artefact ディレクトリーに brokerage.war ができます。
<brokerage_home>/solutions ディレクトリーにはコンパイルおよびGeronimo環境で稼動させるための移行済みのソースファイル類が含まれています。
移行したオンライン仲介サンプル・アプリケーションをデプロイするには、Geronimoサーバーが起動して正常稼動していることを確認してから以下のコマンドを実行します。
deploy --user system --password manager deploy <brokerage_home>/geronimo-artefact/brokerage.war
アプリケーションがデプロイされたら、Webブラウザーを開いて以下のURLにアクセスしてください。
http://localhost:8080/brokerage
JBoss環境でアプリケーションをテストした時に使ったユーザー名、パスワードと同じものを指定してログインします。
この記事ではO/Rマッピング層にHibernateを使っているサンプル・アプリケーションをJBossからApache Geronimoへ移行する方法を紹介しました。JBossで提供されている機能・フィーチャーの全てが現時点のGeronimoでは実装されているわでけはないので、結果的に若干の追加のコーディングが必要でしたが、全体的な移行の難易度は低いものでした。
Bookmark this on Delicious Digg this | Privacy Policy - Copyright © 2003-2009, The Apache Software Foundation, Licensed under ASL 2.0. |