JPAを使っての実装
実装のための準備
前節の冒頭でも書きましたが、JPA自体はO/Rマッパーを隠ぺいするため仕様です。隠ぺいという言葉が否定的に聞こえるのであれば、O/Rマッパーを意識せずにO/Rマッピングを行うための仕様であると言えます。
とは言え、環境を構築する場合にはO/Rマッパーを意識せざるを得ません。今回はGlassFishにバンドルされているTopLink EssentialsというO/Rマッパーを使用します。バンドルされているため、GlassFishをインストールすればTopLink Essentialsもインストールされます。開発環境としてはNetBeansを使用します。GlassFishとNetBeansのインストール方法については「GlassFishとNetBeansのインストール」を参考にしていただければと思います。
ちなみにJBossにはHibernateがバンドルされています。バンドルされているWebアプリケーションサーバであれば準備はこれだけです。データベースはMySQLを使用します。インストールについては「Webアプリケーションの作成 GlassFish管理コンソールを使う」を、操作の仕方については「Webアプリケーションの作成 MySQL Workbenchを使う」を参照ください。
一からデータベースを構築することは難しいため、当記事のトップにデータベース構築サンプルとして.sqlファイルを用意しています。MySQL Workbenchでのインポートの仕方については「Webアプリケーションの作成 JDBCレルムで認証実現」の4ページ目で解説しています。ページトップに「サンプルコード」のsqlファイルとして置いています。MySQL Workbenchでimportしてデータベースの構築を行ってください。
NetBeansを使っての実装
プロジェクトの作成
前編ではJavaアプリケーションを使ってJPAを実装します。
NetBeansで[ファイル]-[新規プロジェクト]をクリックすると[新規プロジェクト]画面が開きます。右ペインに[プロジェクトを選択]があり、その下に[カテゴリ]があるので[Java]を選択します。その右側にある[プロジェクト]の[Javaアプリケーション]を選択し[次へ]ボタンをクリックします。
[新規プロジェクト]画面はそのままで、右ペインが[名前と場所]に変っているはずです。[プロジェクト名]は何でも構いませんが、今回は「JPASample01」と入力します。[主クラスを作成]のチェックボックスにチェックを入れ、主クラス名にはパッケージ名を含んだクラス名を入力します。ここでは「ja.kawakubo.JPAStandalone」と入力します。パッケージ名は筆者のドメイン名であるため、適宜変更してください。
[完了]ボタンをクリックすると右ペインにJPAStandaloneクラスがエディタで開きます。
JPAのプレイヤーの紹介
いきなりJavaアプリケーションを作成しても構いませんが、やはり基本となるプレイヤーは整理する必要があります。表1がJPAの主要なプレイヤーです。後編では裏方さんも紹介します。
| JPAのプレイヤー | 役割 |
| Entityクラス | Entityという言葉は多用されますが一般的にRDBのテーブルを表します。それをオブジェクトモデルとして表現したものがEntityクラスです。この時点でO/Rマッピングの中心となるのがEntityクラスであることが分かります。 |
| Entityオブジェクト | Entityに対し、Entityインスタンスはテーブルの1行を表します。それをオブジェクトモデルとして表現したものがEntityオブジェクトです。つまりEntityクラスをインスタンス化したものを当記事ではEntityオブジェクトと呼ぶことにします。 |
| Entityマネージャ | Entityオブジェクトを使い、実際のRDBに対しCRUD操作を行います。 |
| Entityマネージャファクトリ | 文字通り、Entityマネージャを生成する役割を持っています。 |
Entityクラスの要件
Entityクラスは以下に従ってコーディングする必要があります。
- javax.persistence.Entityアノテーションによりクラスをアノテーションしなくてはならない
- publicまたはprotectedの引数のないコンストラクタを持っていなくてはならない。ただし、その他のコンストラクタも持つことはできる
- クラス、メソッド、永続性フィールド(RDBのテーブルのカラムに相当するフィールド)をfinal宣言してはならない
- EntityオブジェクトはEntityマネージャによりRDBのCRUD操作と結び付けられている状態(MANAGED状態)と結び付けられていない状態(DETACHED状態)があるが、DETACHED状態の値として渡される場合、Serializableインターフェースを実装しなければならない
- Entityクラスでないクラスを継承する場合、その継承されるクラスはEntityクラスである必要がある
- 永続性インスタンス変数は、private、protected、package-privateのいずれかで宣言されていなければならず、Entityクラスのメソッドを介してのみアクセスできる
以上の規則に従ってEntityクラスを作成します。データベースは「実装のための準備」で構築したimoshopというスキーマを使用します。その中にmeigaraテーブルが存在しています。そのmeigaraテーブルを表すMeigara.javaというEntityクラスを作成します。
クラスを作成するにはNetBeansの左ペインから[プロジェクト]タブを選択します。JPASample01プロジェクトを右クリックし、[新規]-[Javaクラス]を選択すると[新規Javaクラス]画面が表示されます。[クラス名]に「Meigara」、[パッケージ名]に「jp.kawakubo」と入力し[完了]ボタンをクリックするとMeigaraクラスを作成するエディタが右ペインに表示されます。
ただし、このままではJPA関連のクラスが存在しないため、TopLink Essentialライブラリをプロジェクトに追加する必要があります。NetBeansの左ペインで[プロジェクト]-[JPASample01]-[ライブラリ]を選択し、右クリックします。[プロパティー]をクリックすると[プロジェクトプロパティー]画面が表示されるので、右ペインの[コンパイル]タブを開き、右側の[ライブラリを追加]ボタンをクリックします。[ライブラリを追加]画面が表示され、[大域ライブラリ]の下に追加すべきライブラリの候補が並んでおり、下の方にスクロールすると[TopLink Essentials]があるはずです。それを選択し、[ライブラリを追加]ボタンをクリックすると、元の[プロジェクトプロパティー]画面に戻ります。[了解]ボタンをクリックすると、プロジェクトのライブラリにtoplink-essential.jarとtoplink-essentials-agent.jarが追加されていればOKです。
これでjavax.persistence.*のクラスが使用できるようになります。また、MySQLのドライバを追加する必要があります。上記と同様の手順で[大域ライブラリ]から[MySQL JDBCドライバ]を選択してライブラリを追加してください。
