JPA 2.0 Entity クラスの自動生成 (Eclipse 3.7)
Eclipse 3.7 で JPA (Java Persistence API) の Entity クラスを自動生成する方法について。
JPA における Entity クラスとはデータベースへのデータの出し入れを簡単に行うためのオブジェクトを定義するためのもの。Entity クラスがテーブルのスキーマ定義で、そのインスタンスが 1 レコードと考えるとイメージしやすいかもしれない (実際には結合などで生成されることもあるから必ずしもテーブルと 1 対 1 ではないが)。
IDE | Eclipse 3.7 (Indigo) |
---|---|
Plugins | Dali Java Persistence Tools - Eclipse Link JPA Suppor 3.0, JPA Diagram Editor 1.0, JPA Support 3.0 Eclipse Java EE Developer Tools 3.3 |
Database | MySQL 5.5.14 |
テーブル定義
例として、商品名 name
と価格 price
を持つ以下のようなテーブル product
を作成します。
id | name | price | 1 | Caffee | 300 |
---|---|---|
2 | Tea | 250 |
3 | Water | 0 |
テーブルとデータを生成するための DDL は以下の通り。
mysql> create table product(id integer not null primary key auto_increment, name text not null, price int not null); Query OK, 0 rows affected (0.16 sec) mysql> insert into product(name,price) values('Caffee',300); Query OK, 1 row affected (0.03 sec) mysql> insert into product(name,price) values('Tea',250); Query OK, 1 row affected (0.00 sec) mysql> insert into product(name,price) values('Water',0); Query OK, 1 row affected (0.00 sec)
Entityクラスの作成
データベースに定義した product
テーブルから Entity クラスのソース生成を行います。
-
Project Explorer の [New]-[Other]-[JPA]-[JPA Entities from Tables] で接続先とスキーマ、Entity クラス化したいテーブルを選択します。接続先が定義されていない場合は新しく作成してください。複数のテーブルから一つの Entity クラスを作成することができます。
-
複数のテーブルを選択した場合はテーブル間の関連付けを行います。今回は前の画面で
product
テーブル 1 つしか選択していないので関連付けに何も表示されていません。 -
テーブルと Entity クラスとのマッピングを行います。キーの自動生成は
id
カラムで MySQL の自動インクリメント列を使用したので sequence を選択し RDBMS に任せます。あとはデフォルトのまま。 -
Entity クラスの名前やスーパークラス、各フィールドの型を定義します。Finish ボタンを押すと Entity クラスが作成されます。
Entityクラスのソース説明
生成されたコードのコメントやら空行やらを整形して説明を入れてみます。
package org.koiroha.jpa; import java.io.Serializable; import javax.persistence.*; /* @Entity を付けて Entity クラスであることを明示します。 * テーブル名とクラス名が異なる場合は @Table(name="tbl_product") * のようにテーブル名を指定するアノテーションを付けます。 * Entity クラスは Serializable である必要があります。 * Entity クラスは final 宣言されたフィールドやアクセサを * 持つことができません。 */ @Entity public class Product implements Serializable { private static final long serialVersionUID = 1L; // このフィールドが ID であり値が DB 側で自動生成される // ことを示します。 @Id @GeneratedValue(strategy=GenerationType.SEQUNCE) private int id; // MySQL の text 型は CLOB と同じ扱いなので @Lob が付け // られています。 @Lob() private String name; // 名前も型もカラムと一致するので何の指定もありません。 private int price; // デフォルトコンストラクタは Entity クラスに必須です。 public Product() { } // あとはアクセサ public int getId() { return this.id; } public void setId(int id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public int getPrice() { return this.price; } public void setPrice(int price) { this.price = price; } }
個人的な話ですが、後になってパフォーマンスや問題回避的な理由で綺麗なテーブル設計を崩さなければいけないことが多いので Entity クラスをそのまま業務ロジックで使いまわさず、単なるデータオブジェクトとして使う方が良いかと思います。
接続先の設定
Entity クラスが生成されると同時にソースフォルダの META-INF/persistence.xml が出来ています。これを開いてデータベースの接続先を設定します。以下は説明簡略のためコネクションプールを使用せず都度接続する設定を行っています。
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="jpatest" transaction-type="RESOURCE_LOCAL"> <class>org.koiroha.jpa.Product</class> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpatest"/> <property name="javax.persistence.jdbc.user" value="jpa"/> <property name="javax.persistence.jdbc.password" value="jpa"/> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> </properties> </persistence-unit> </persistence>
動作確認
JPA を使用したデータの出し入れについては別途詳しく記述します。取り合えす今回は一覧を取得する部分だけ。
import javax.persistence.*; // ... public static void main(String[] args) { EntityManagerFactory factory = Persistence.createEntityManagerFactory("jyrobot"); EntityManager manager = factory.createEntityManager(); TypedQuery<Product> query = manager.createQuery( "select product from Product product", Product.class); for(Product p: query.getResultList()){ System.out.printf("[%d] %s: %d円%n", p.getId(), p.getName(), p.getPrice()); } manager.close(); factory.close(); }
[EL Info]: 2011-08-29 01:28:17.546--ServerSession(20531348)--EclipseLink, version: Eclipse Persistence Services - 2.3.0.v20110604-r9504 [EL Info]: 2011-08-29 01:28:17.968--ServerSession(20531348)--file:/C:/Documents and Settings/... login successful [1] Caffee: 300円 [2] Tea: 250円 [3] Water: 0円 [EL Info]: 2011-08-29 01:28:18.328--ServerSession(20531348)--file:/C:/Documents and Settings/... logout successful