fc2ブログ
ホーム   »  Java  »  JPA 2.0 Entity クラスの自動生成 (Eclipse 3.7)

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 クラスのソース生成を行います。

  1. Project Explorer の [New]-[Other]-[JPA]-[JPA Entities from Tables] で接続先とスキーマ、Entity クラス化したいテーブルを選択します。接続先が定義されていない場合は新しく作成してください。複数のテーブルから一つの Entity クラスを作成することができます。

  2. 複数のテーブルを選択した場合はテーブル間の関連付けを行います。今回は前の画面で product テーブル 1 つしか選択していないので関連付けに何も表示されていません。

  3. テーブルと Entity クラスとのマッピングを行います。キーの自動生成は id カラムで MySQL の自動インクリメント列を使用したので sequence を選択し RDBMS に任せます。あとはデフォルトのまま。

  4. Entity クラスの名前やスーパークラス、各フィールドの型を定義します。Finish ボタンを押すと Entity クラスが作成されます。

  5. 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
    
コメント
トラックバック
トラックバック URL
コメントの投稿
管理者にだけ表示を許可する
Profile
Takami Torao
Takami Torao
C/C++ 使いだった 1996年、運命の Java と出会い現在に至る。のらアーキテクト。
Yah, this is image so I don't wanna eat spam, sorry!
Search

Google
MOYO Laboratory
Web

カテゴリー
最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
ブロとも申請フォーム
RSSフィード
リンク