OpenJPAは,Java EE 5で導入されたEJB3.0(JSR220)のうち,Java Persistence API(JPA)を実装したオープンソースプロダクトです。2007年8月28日にバージョン1.0.0がリリースされました(1.0.0のアナウンス)。配布はApacheライセンスの下で行われています。
これが組み込まれているプロダクトには,Spring FrameworkやApache Geronimoがあります。Apache Geronimoは,2007年8月20日にリリースされたバージョン2.0.1がJava EE 5互換の認定を受けています(リリース時のアナウンス)。
また,OpenJPAは商用製品のBEA Kodoのベースにもなっています。というよりも,BEA KodoにおけるJPAの実装が2006年2月にApache Software Foundationに寄贈されたものがOpenJPAなのです。トップレベルプロジェクトに昇格したのは2007年05月16日です。
Kodoは,もともとSolarMetricという企業が開発していた製品で,RDBとJavaプログラムとの間でデータをやりとりするO/Rマッピングの仕様であるJava Data Objects(JDO) (JSR12)を実装したものでした。この企業をアプリケーションサーバWebLogicで知られるBEAが2005年11月に買収し,EJB3.0の実装がKodoに組み込まれました。それが現在のBEA Kodoです。
オープンソースのプロダクトは,もともと技術者のボランティアで開発が進められていたものという認識がありましたが,最近では,商用製品(とくにその基盤部分)をオープンソースで開発するプロジェクトが増えてきています。そうしたプロジェクトでは,商用製品を開発する企業がメンバーを送り込んで主体的に開発を進めるという体制ができあがっています。つまりそのメンバーは,報酬を得ながらオープンソースプロダクトを開発しているのです。ですから,もはやオープンソース=ボランティアとも言い切れない状態になっているのです。
Java Persistence API(JPA)とは
Java Persistence API(JPA)とは,Enterprise JavaBeans(EJB)のうち,データベースとのやり取りを行う永続化処理の部分をEntity Beanから分離したものです。これにより,Java標準のO/Rマッピングを,EJBコンテナ以外の一般的なJava環境(JDK 5以上)でも実行できるようになりました。
仕様の策定は,O/RマッピングツールHibernateの開発者Gavin King氏を中心として行われ,2006年5月11日に仕様がリリースされました。ちなみに,HibernateによるJPAの実装は,Hibernate AnnotationsとHibernate EntityManagerに組み込まれています。
特徴は,EntityManagerにデータのやり取りを行うメソッドを集中させていること,JDK 5で導入されたアノテーションをふんだんに取り入れていること,EJB QLという問い合わせ言語が以前のバージョンのEJBよりも強化されたことなどが挙げられます。
OpenJPAによるO/Rマッピング
では,実際にOpenJPAを用いてO/Rマッピングを行うことにしましょう。
O/Rマッピングとは,Javaプログラム(Object)とRDBMS(Relational)との間でデータのやり取りをする際に,あたかも両者がオブジェクトのやりとりをしているように見せかけることや,そのための設定を指します。OpenJPAでは,JPAの仕様に基づいたO/Rマッピングを行うことができます。
ここから,その具体的な方法を説明していきます。以下はJDK 5以上で実行可能です。また,実行時にはOpenJPAのlibディレクトリに含まれているJARファイルのフルパスを,環境変数CLASSPATHに追加してください。そしてOpenJPAのルートディレクトリにあるopenjpa-1.0.0.jarは,javaコマンドの-javaagentオプションに指定してください。詳細はOpenJPAのドキュメントなどを参照してください。
persistence.xmlによるデータベース設定
JPAにおいてO/Rマッピングを行うために欠かせないのは,persistence.xmlという設定ファイルです。これには,データベースに対してJDBCによる接続を行うために必要となるドライバクラス名,接続URL,ユーザ名,パスワードを記述します。それと,データベースのテーブルに対応するエンティティクラスの名称も合わせて記述しておきます。
リスト1にpersistence.xmlの例を示します。このファイルは,Javaプログラム実行時のカレントディレクトリの下のMETA-INFディレクトリに配置しておきます。
ルートタグ<persistence>の中には複数の<persistence-unit>タグを記述できます。Javaプログラムから設定を利用されるのは<persistence-unit>のほうです。この中の<property>タグにJDBC接続などで必要な設定を記述します。これらは実行時にシステムプロパティとして設定することもできます。ここでは,OpenJPAに組み込まれているApache Derbyを利用し,Javaプログラムの実行によって,テーブルが存在しなければ自動的に作成するようにしています。
リスト1 接続するデータベースに関する設定(例) - persistence.xml
<?xml version="1.0" encoding="Windows-31J"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="1.0">
<persistence-unit name="miniblog" transaction-type="RESOURCE_LOCAL">
<!-- データベースのテーブルに対応するJavaクラス -->
<class>Miniblog</class>
<!-- データベースに関する設定(JDBC関連など) -->
<properties>
<!-- ドライバクラス名 -->
<property name="openjpa.ConnectionDriverName"
value="org.apache.derby.jdbc.EmbeddedDriver"/>
<!-- 接続URL -->
<property name="openjpa.ConnectionURL"
value="jdbc:derby:openjpa-example;create=true" />
<!-- データベース接続用のユーザ名 -->
<property name="openjpa.ConnectionUserName" value="" />
<!-- データベース接続用のパスワード -->
<property name="openjpa.ConnectionPassword" value="" />
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema" />
<!-- ログ出力の設定(実行したSQLも出力) -->
<property name="openjpa.Log" value="DefaultLevel=WARN,SQL=TRACE" />
</properties>
</persistence-unit>
</persistence>

