JPA + EJB + JSF による Web アプリケーション(その 1)

いよいよ本日から JPA + EJB + JSF による Web アプリケーションの作成に入ります。まずは既存のデータベースで単一のテーブルを利用して、Hibernate のサンプルとして作ったものと同じものを作ってみます。その後、新規にデータベースとテーブルを作成して(以前作ったものではありますが)一から Web アプリケーションを構築する例を取り上げます。結合の話もここでやる予定です。

エンティティクラス(永続化クラス)の作成

EJB プロジェクトを用意して、そこにエンティティクラスを作成します。

package jp.mydns.akanekodou.entity;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;

@Entity
@Table(name = "顧客マスタ")
public class Customer implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "顧客ID")
    @GeneratedValue
    private int id;
    @Column(name = "顧客名")
    private String name;
    @Column(name = "連絡先")
    private String phone;

    public Customer() { }

    public Customer(String name, String phone) {
        this.name = name;
        this.phone = phone;
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
}

JPA では Entity アノテーションを付けてエンティティクラスであることを宣言します。これにより Hibernate のようにマッピングの設定ファイルを作る必要はなくなります。
Table アノテーションはクラス名がテーブル名と同じ場合(たとえばテーブル名が foo でクラス名が Foo のとき)は省略できます。
Id アノテーションは主キーであることを示します。これは必須です。GeneratedValue アノテーションは、このフィールドの値は自動生成することを意味しています(が、今回はデータの挿入はしませんので関係ありません)。
Column アノテーションはフィールド名がカラム名と同じ場合は省略できます。

同じ要領でもう一個。

package jp.mydns.akanekodou.entity;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;

@Entity
@Table(name = "商品マスタ")
public class Product implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "商品ID")
    @GeneratedValue
    private int id;
    @Column(name = "商品名")
    private String name;
    @Column(name = "グループ名")
    private String groupName;
    @Column(name = "仕入単価")
    private Integer purchasePrice;
    @Column(name = "卸単価")
    private Integer wholesalePrice;

    public Product() { }

    public Product(
        String name,
        String groupName,
        Integer purchasePrice,
        Integer wholesalePrice
    ) {
        this.name = name;
        this.groupName = groupName;
        this.purchasePrice = purchasePrice;
        this.wholesalePrice = wholesalePrice;
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGroupName() {
        return groupName;
    }
    public void setGroupName(String groupName) {
        this.groupName = groupName;
    }
    public Integer getPurchasePrice() {
        return purchasePrice;
    }
    public void setPurchasePrice(Integer purchasePrice) {
        this.purchasePrice = purchasePrice;
    }
    public Integer getWholesalePrice() {
        return wholesalePrice;
    }
    public void setWholesalePrice(Integer wholesalePrice) {
        this.wholesalePrice = wholesalePrice;
    }
}

persistence.xml の作成

JPA の設定ファイルである persistence.xml を作成します。ejbModule/META-INF 内に作成してください。

<?xml version="1.0"?>
<persistence 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"
  version="2.0">
  <persistence-unit name="menudbManager">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:/mysql/menudb</jta-data-source>
    <class>jp.mydns.akanekodou.entity.Customer</class>
    <class>jp.mydns.akanekodou.entity.Product</class>
    <properties>
      <property name="hibernate.dialect"
        value="org.hibernate.dialect.MySQLDialect" />
    </properties>
  </persistence-unit>
</persistence>

provider 要素には JPA の実装クラスを指定します。JBoss AS には Hibernate があらかじめ組み込まれているので、Hibernate の jar ファイル群を別途用意する必要はありません。jta-data-source 要素にはは以前 JBoss AS をインストールしたときに作成したものを指定します。class 要素でエンティティクラスを登録します。properties 要素には property 要素を必要なだけ書きます。ここでは hibernate.dialect の値を設定しています。ちなみに "dialect" は「方言」という意味で、どのデータベースの「方言」を使用するのか、という意味です。見てお分かりの通り、今回は MySQL を使います。