Java Persistence API(JPA)は、EJB 2.1のEntity Beanの仕様をEJB3.0から独立した1つの仕様にまとめられものです。JPAは、リレーショナルデータベース(RDB)をJavaのアプリケーションから操作するために、オブジェクト/リレーション(O/R)マッピングの仕組みを提供します。O/Rマッピングは、Javaの永続クラスとRDBのテーブルをマッピングすることで、データの永続化を容易に行えるようにしたものです。JPAはデータベースをJavaのオブジェクトとして扱えるため、データベースにSQL文を発行する場面を少なくすることができます。
以下に、JPAを理解するうえで必要な用語について簡単に説明します。
永続ユニット
persistence.xmlで定義される永続化するための論理的な集合です。複数の永続クラス(エンティティクラスなど)やO/Rマッピングファイルによって定義されます。
Entity
Entityは、データベースのテーブルと対応付けられるJavaクラスです。このインスタンスがデータベースの1レコードに相当します。
永続コンテキスト
エンティティクラスのインスタンスの集合です。JPAでは永続コンテキストに対して操作を行い、トランザクションの区切りでデータベースと同期がとられます。
Java Persistence Query Language(JPQL)
データベースのSQLにあたる問い合わせ言語です。
persistence.xml
エンティティクラス、O/Rマッピングファイル、トランザクションのタイプなどの構成情報を永続ユニットに定義できます。
orm.xml
O/Rマッピングファイルです。O/RマッピングファイルはEntityとデータベースとの対応付けを記述します。アノテーションでも記述することができるため必須ではありません。
EJB2.1のEntity BeanとJPAのEntityでは、以下の点が大きく異なります。
Entityを構成するファイル
EJB2.1のEntity Beanでは、規約に基づいてEntity Beanクラス、HomeインタフェースおよびComponentインタフェースを作成して、deployment descriptorにEntity Beanを定義する必要がありました。
JPAのEntityでは、Javaオブジェクトとして操作するためのクラスを作成して、そのクラスに@Entityアノテーションなどでデータベースとのマッピング情報を定義するだけです。
Entityの呼び出し方法
Java EEではJPAのEntityに限らず、Dependency Injectionを使用して従来のlookup処理を簡単に記述することができます。
以下に、JPAで使用する主なアノテーションについて、簡単な例を紹介します。
javax.persistence.Entityアノテーション
クラスをEntityとして定義するアノテーションです。以下の要素を指定できます。
要素名 | 解説 |
---|---|
name | Entityの名前。省略するとクラスの名前がEntityの名前になります。 |
Entityアノテーションの使用した例
package sample; import javax.persistence.Entity; @Entity public class Employee { @Id private int id; private String name; private String address; private String tel; } |
javax.persistence.PersistenceContextアノテーション
EntityはEntityマネージャで管理されています。このEntityマネージャをDependency Injectionするためのアノテーションです。以下の要素を指定できます。
要素名 | 解説 |
---|---|
name | コンテキストを参照する環境でEntityマネージャにアクセスする場合の名前です。Dependency Injectionの場合は使用しません。 |
properties | コンテナや永続プロバイダにプロパティを指定する場合に使用します。 |
type | トランザクションのタイプを指定します。 |
unitName | 永続ユニットの名前。JNDIでアクセスできる名前を指定します。 |
PersistenceContextアノテーションを使用した例
@PersistenceContext EntityManager em; public Employee getEmployeeByPrimaryKey (int id) { return em.find(Employee.class, id); } |