EBeanを使った親子関係のDB操作を実行
先ほどのApplication.javaのindex()メソッドを下記のように修正してください。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
再び「http://localhost:9000」にアクセスすると、Parentおよび関連するChildが保存されて、以下の結果が画面に表示されます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
Play frameworkのトランザクション制御
ここからは、トランザクション制御について解説します。EBeanでは、デフォルトの状態で通常の操作を行ってもトランザクション制御が行われません。例えば、下記のコードがあるとします。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
ここでparent1が持つChildを削除した後、すぐに(parent1が保存される前に)エラーが発生して処理を抜けた場合、そのChildは削除されたままになってしまいます。しかし、エラーが発生した場合は削除されずに実行前のままであってほしい場合がよくあります。そのような場合は最後まで処理が実行されて初めてDBへ反映(コミット)するようにトランザクションを使います。
トランザクション処理クラス(TxRunnable)
まず、EBeanではトランザクションを扱うクラスとして「TxRunnable」が用意されています。これをEBean#execute()メソッドで呼び出します。
Parentが持つ全Childを削除した後に例外が発生した場合、Childが削除されていないか試してみましょう。下記のようにindex()メソッドを書き換えてください。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
トランザクション処理の実行
再びWebブラウザを更新してください。前回と同じ画面が表示されChildが削除されていないことが確認できます。ちなみに上記ソースの例外を発生させている個所を削除して、再度実行すると、今度は問題なくChildが削除されていることが確認できます。
トランザクション処理のやり方は場合によりけり
このように、EBean経由で基本的に使われるDB操作を紹介しました。このほかにも、EBeanではSQLを直接実行する機能など、ほかの機能も用意されています。また今回紹介した方法とは別の方法で同じこともできます。どの方法がベストかは場合によりけりです。詳細について知りたい方はEBeanのサイトなどでご確認ください。
ほかのDB(PostgreSQL)への接続
最後に、実際によく使われるH2からほかのDBへの接続を紹介します。今回は、PostgreSQLに接続してみます。
接続するDBの作成
まず、PostgreSQLに接続するDBを作成してください。DBのインストールおよび作成方法は、ここでは割愛します。PostgreSQLのサイトなどでご確認ください。
※ DBの文字コードがUTF-8になっているか確認してください。ちなみに、Windows版のPostgreSQL 9.1ではデフォルトでUTF-8になっています。PostgreSQLの文字コードの確認方法や変更方法はPostgreSQLのサイトなどでご確認ください。
JDBCの配置
プロジェクトを作成したディレクトリで「lib」フォルダを作成し、そこにJDBCドライバを置いてください。Playでは、すでにプロジェクト直下のlibフォルダにクラスパスが通っているので、Jarファイルを配置するたびにクラスパスを設定する必要はありません。
※ 逆に、クラスパスが通っていない場所にJarファイルを置いてもJarファイルを認識してくれません。
application.confの設定
application.confを開き、PostgreSQLにアクセスできるように下記のよう書き換えてください。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
Playの再起動
Playが起動中の場合は、Playを再起動してください。Windowsのコマンドプロンプト上の場合、下記の手順で再起動できます。
- [Ctrl]+[D]キーでPlayを停止
- 「run」と入力しPlayを起動
※ まだ、起動していない場合は起動するだけで問題ありません。
確認
再びWebブラウザにて確認してみましょう。今回はParentテーブルとChildテーブルにレコードが登録されることを確認できるようにApplication.javaのindex()メソッドを下記のように修正してください。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
次にWebブラウザより「http://localhost:9000」にアクセスしてください。DBテーブル作成のEvolutionのページが表示されます。画面上の「Apply this script now!」をクリックすると、PostgreSQLにH2で使っていたDBテーブルが作成され、プログラムで実行したデータが登録されます。
PostgreSQLのDBにアクセスして画面上に表示された内容がDBに登録されているか確認してください。画面と同じ内容が登録されているはずです。
今回はJava側のコードで直接SQLを扱っていないので、DB変更の対応は、これだけです。
※ application.confでは、DB接続以外にもいろいろな設定(autocommitやconnectionTimeoutなど)が用意されています。詳細はPlay frameworkのサイトを参照してください。
次回は、Play frameworkのビュー周り
今回はPlay frameworkのDB周りの機能を一通り紹介してきました。まだまだ紹介しきれていない機能(「Database Evolutions」など)もありますが、取りあえず手軽にDB周りの処理が行えるようになったかと思います。
次回はPlay frameworkのビュー周りの機能を紹介しますので、お楽しみに。
著者紹介
長谷川 智之(はせがわ ともゆき)
2008年より、株式会社ビーブレイクシステムズに在籍。
基本的にはどんな問題があるか分からない新しい技術より、問題点をクリアした使い慣れた技術の方を好む保守派。しかし、最近のヤングでナウな新世代の考えに乗り遅れてきたため、新しい技術にも手を出し始める。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- MySQLの常識を知りセットアップしてJSPからDB操作
Webアプリの常識をJSPとStrutsで身につける(8) - Hibernateで覚えるO/RマッピングとBeanの常識
Webアプリの常識をJSPとStrutsで身につける(9) - 悲観もあれば楽観もある「トランザクション」の常識
企業システムの常識をJBossで身につける(8) - Commons DBCPを超えるTomcat JDBC Poolとは
Tomcat 7の新機能で何ができるようになるのか?(番外編) - EclipseベースIDEでSpring MVC開発ができRoo!
Rooでアプリ開発をRapidしようぜ!(2) - App EngineをjQueryでAjax化しBigtableをCRUD操作
Google App Engineで手軽に試すJavaクラウド(3) - XAMPP環境からGoogle Cloud SQLに移行するには
Google Cloud SQLは基幹系で使えるのか(前編) - 流れるようにSQLっぽくO/RマッピングできるS2JDBC
Java初心者が超俊敏にWebアプリを作る方法(最終回) - iBATISのORMとSpringのAOPを活用したDBアクセス
オープンソースTERASOLUNAで作るWebアプリ(3)