パーシステンス教育界、技術者コミュニティでJava言語の教育と啓蒙に長年携わってきた筆者が、独自の視点からJavaの面白さを掘り下げていく。5の間には、機能差があり過ぎたため、現場で導入ができずに、これまで移行を見送ってきた読者も多いことでしょう。移行してもいい時期になりました。注目の機能がいくつかあります。今回は、注目度が高いパーシステンス(永続化)に関係するものについて紹介しましょう。Candidate)版ですので、リリース版では違っている点があるかもしれません。DBとはパーシステンスによく利用されるのは、リレーショナルデータベース(RDB)です。JDK5まではRDBを別途用意する必要があったので、環境を用意するのにもちょっとした手間が掛かりました。教育の現場では、学生が自分のパソコンで自習できるようにオープンソースのRDBなどを紹介することが多いですが、インストールに手間が掛かったり、環境設定がちょっと難しかったりすると、肝心のRDBを使うところまでいけないということになってしまうことがあります。オープンソースのRDBは大体UNIX系OS用に開発されてきたものが多いので、Linuxであれば最初に全部のパッケージを選択してインストールすれば簡単に用意することができます。勉強のためだけにLinuxマシンを用意するというのも難しく、RDBを使えるようになる前にLinuxに慣れる必要があるため、ハードルが高くなっているのが実情でしょう。これは、DBを使ったプログラミングについて勉強をしたいと考えているビジネスマンにとっても同じです。いったことから、筆者はマルチプラットフォームで動作するJavaの特性を利用したRDBへの期待を大きく持っていたので、HSQLDBのようなJavaで実装されたRDBを知ったときにはすぐに使って、学校での授業へも導入しました。このRDBはJBossなどに標準で同梱されているので、知っている読者も多いでしょう。Development)という観点からも、開発環境であるJDKをインストールすれば、RDBもすぐに使えるというのは非常に大きな意味があります。いくつものソフトウェアをダウンロードしてきてインストールと設定をするのはやはり面倒です。GUIアプリケーションやWebベースシステムが普及して、マルチスレッドプログラミング、ネットワークプログラミングが当たり前となってしまった現在では、排他制御や同期といったことを意識して、なおかつ障害が発生しないようなプログラミングが強く要求されるようになってきています。RDBを使えば、これらについてわざわざ自分で実装する必要もなく、少ない労力で安定したプログラムを作成することができます。いまや、OSへの依存度が高いファイルシステムを直接使って、データを書き出したり、読み込んだりといった操作をするプログラムよりも、RDBを操作するプログラムを記述する機会の方が多いのではないでしょうか。ここで、JDK6にはHSQLDBのようにJavaで実装されたRDBが標準で同梱されます。DBという名前で紹介されています。DBのドキュメントも用意されていることが分かりました。DBの方も読んでみたところ、どちらもほとんど同じことが書いてありました。Derbyのサイトで得た知識が無駄にはならず、助かりました。-に書いてあることには注目しておいた方がいいでしょう。ソースコードを使ってビルドしているとあります。注意書きもしてあり、製品には使用しない方が良いようです。Beta版の時点では、JDBC4版のバイナリは同梱されていなかったことを考えると、JDBC4対応は進んでいるようですが、実際のJDK6リリース版ではこれがどうなっているのか、気になるところです。Access版である点は変更なしのようです。DBはクライアントサーバ方式のRDBでもアプリケーション組み込みのRDBとしても利用できる便利なRDBです。簡単に使い方を紹介しましょう。DB関連のファイルは$JAVA_HOME/dbにあります。DBを使うときは、このディレクトリを環境変数DERBY_HOMEに設定しておくといいでしょう。サーバクライアント方式で使う場合は、$DERBY_HOME/frameworks/NetworkServerの方を使い、組み込み方式で使う場合は、$DERBY_HOME/frameworks/embeddedの方を使います。DBにはij.ksh(ij.bat)というコマンドラインツールが付属していて、SQL文を直接使ってRDBを操作することもできます。ここでは、Linuxでの、バージョンの確認方法だけ紹介しておきます。Windowsでも、環境変数JAVA_HOME、DERBY_HOME、PATHを設定してコマンドプロンプトからsysinfo.batと入力すれば、同じような出力が出てくるはずです。4.0ドライバが動作していることが分かります。DBを組み込み方式で使うときは、従来の「Class.forName("org.apache.derby.jdbc.EmbeddedDriver")」というJDBCドライバを読み込むためのおまじないは必要ありません。接続を開始することができます。DBではデータベースの接続用URLへ属性を指定することができます。ここでは、create=trueとして接続時にDBがない場合は、作成をし、既存のDBがある場合には、そのまま接続をするようにしています。この例では、db/sampleとDB名を指定しているので、プログラムを実行したカレントディレクトリにdbディレクトリとその中にsampleディレクトリが作成され、そこにDB用のファイルが作成されます。絶対パスでDB名を指定することもできます。DriverManager.getConnection("jdbc:derby:db/sample;create=true");組み込み方式のRDBでは、アプリケーション終了時にRDBも正常終了するように気を使う必要があります。DBでは、次のようにデータベースの接続用URLへshutdown属性を指定してRDBが正常にシャットダウンするようにします。この処理によりRDBはコネクションを強制終了するため、必ずSQLExceptionを発生させる点には注意しましょう。あるツールを使います。startNetworkServer.kshで起動、stopNetworkServer.kshで停止になります。Windows用に対応するバッチファイルもあります。使うことになりますから、組み込み式とは別物として意識する必要があります。APIを使ってみるさて、本題のパーシステンスAPIです。Editionにも取り込まれた機能なので、これからはどんどん利用したいところです。ファイル操作をするよりはRDBを使った方が楽ですが、アノテーションのおかげで、パーシステンスAPIもかなり楽に使えるようになりました。JDKには標準では付いていないので、実装は別途用意する必要があります。JPAといったものがあります。編集部注:Hibernateについての詳細を知りたい読者は、「Hibernateを試すための準備」をご参照ください。パーシステンスAPI利用をしてみました。必要なものは、Hibernate-3.2.1.GA、Hibernate-annotations-3.2.0.GA、Hibernate-entitymanager-3.2.0.GAになります。これらをダウンロード後、展開して必要なJARファイルを手に入れます。普通はAntのビルドファイルを使うのですが、使っているJARファイルが分かりやすいように、ここでは次のようなLinuxのシェルスクリプトでコンパイルを用意しました。実行もこれと似たようなスクリプトを用意して実行できます。プログラミングが簡単になる分、プログラムが自動的に行うことが増えているので、必要なJARファイルもたくさんあります。パーシステンスAPIを使うためには、クラスパスのルートに次のようなMETA-INF/persistence.xmlファイルを用意します。今回は、hibernate.cfg.xmlを参照するような書き方をしてみました。ディレクトリ構成は次のようになります。SampleEntityクラスがパーシステンスをする対象で、Mainクラスでパーシステンスのサンプル処理を記述しています。}}詳細な情報はhibernate.cfg.xmlに書きましたが、ここで指定するドライバクラスなどは使用するRDBに依存します。Derbyのものが利用できます。最近のEoDの流れで、Hibernateでもエンティティの値を保存するためのテーブルがない場合に、Hibernateへ自動で作成するように設定をすることができます。hibernate.hbm2ddl.autoプロパティでcreateを指定しておくだけで実現できてしまうので、これまでテーブルを作成するためのDDLを用意したり、テーブル構造とクラスのソースコードを同期していた苦労がうそのようです。次に実行例の一部を示しますが、Hibernateが動作してたくさんの情報が出力されています。Driverが使われていることが分かるメッセージが出力されています。最後の方で警告が出ているのが気になりますが、これはデータベースへの1回目の接続時にDBが作られて、2回目の接続で発生しているだけです。1度実行したら、データベースの接続URLにあるcreate=trueの指定を取り除けば発生しなくなります。途中にJDK6と出力されているのがパーシステンスでDBへ1回保存してから、また読み込んで表示しているエンティティの情報になります。作成されませんでした。代わりに既存のデータベースに接続されました。DBに付属のdblookコマンドを使ってテーブルが作成されていることを確認してみたところ、次のように作成されていました。INTEGER);(略)パーシステンスAPIも基本から説明をすると長いですし、きちんと使えるようになるには詳細を理解する必要があります。やって新しいJDKがリリースされる時期に合わせて、既存技術がどのように進化したのか、どんな新しい技術が普及しつつあるのか、を確認するという意味でほんの触りだけでも触れてみると結構楽しいものです。console()メソッド最後にちょっとしたTipsを紹介しておきます。JDK6からjava.lang.Systemクラスにconsole()メソッドが追加されました。e.getName());」(上記Main.javaの赤字)のように使います。これまで、inやoutなどを使っていましたが、このメソッドのおかげでキャラクタベースの入出力が簡単にできるようになりました。したちょっとした機能追加もうれしいところです。ジェネリック型やアノテーションの導入などでJavaも複雑になってきていますが、機能を理解するとプログラミングがいままでよりも楽しくできることに気が付きます。Javaって本当に面白いですね編集部注:今回使用したソースはここからダウンロードできます。5.0「Tiger」で何が変わるか?」をご参照ください。ひろし)Webシステムの運用と開発、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。Ja-Jakartaプロジェクトへ参加し、コミッタの一員として活動を支えている。長野県の地域コミュニティである、SSS(G)やbugs(J)の活動へも参加している。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。