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 を使います。