[[HOME>http://www.trance.co.jp/]] > [[技術情報]] > [[Java>http://www.trance.co.jp/wiki/index.php?%B5%BB%BD%D1%BE%F0%CA%F3#xe479566]] > Java Persistence API
* Java Persistence API 1.0(JPA) [#p067abdd]
#contents
** Java Persistence APIとは [#ye590c98]
- Javaオブジェクトの永続化のためのAPI
以前はEJBの仕様に含まれていたものが、EJB3.0より切り離され、EJBコンテナ以外での使用が可能となった.
また、O/Rマッピング、アノテーションを使用することにより、以前のEJBのような複雑な仕組みではなく、よりPOJOとして開発できるようになった.

// ** 特徴
// - アノテーションによるマッピング → XML設定ファイル減
// - 4つのエンティティ状態
// -- new 
// -- managed
// -- detached
// -- removed
// - 

** 実装プロダクト [#h478525f]
Java Persistence APIは仕様であるため、実装プロダクトがいくつか存在する.
- Hibernate
- TopLink

** 使用方法 - 準備 (実装プロダクト:Hibernate) [#hc112776]
今回は、実装プロダクトとして、「Hibernate」を使用する.
*** インストール [#zf7238d6]
- ''ダウンロード''
以下のサイトより、3つのパッケージをダウンロードする.
サイト:http://www.hibernate.org/
パッケージ (2007/09/13時点)
-- Hibernate Core 3.2.5.ga
-- Hibernate Annotations 3.3.0 GA
-- Hibernate EntityManager 3.3.1 GA

- ''クラスパスを通す''
それぞれのパッケージは多くのライブラリに依存しているため、必要なライブラリ全てクラスパスを通す.
必要であるかは、同封のドキュメントにて確認する.
今回は実行時に必要なライブラリのみパスを通す.
-- Hibernate Core 3.2.5.ga
--- jta.jar
--- commons-logging-1.0.4.jar
--- xml-apis.jar
--- asm-attrs.jar
--- dom4j-1.6.1.jar
--- antlr-2.7.6.jar
--- cglib-2.1.3.jar
--- asm.jar
--- jdbc2_0-stdext.jar
--- xerces-2.6.2.jar
--- jaxen-1.1-beta-7.jar
--- commons-collections-2.1.1.jar
--- javassist.jar
--- hibernate3.jar

-- Hibernate Annotations 3.3.0 GA
--- hibernate-annotations.jar
--- ejb3-persistence.jar
--- hibernate-commons-annotations.jar

-- Hibernate EntityManager 3.3.1 GA
--- hibernate-entitymanager.jar
--- hibernate-validator.jar
--- jboss-archive-browsing.jar

*** 設定ファイル [#k3cbb4f0]
persistence.xmlと言うファイルを作成し、DB等の設定を定義する.
ファイルの配置場所は、クラスパスの通った「META-INF」配下に配備する.
META-INF/persistence.xml
以下のサンプルはDBにMySQLを使用した例.
|[DB_ID]|ユーザID|
|[DB_PASSWORD]|パスワード|
|[DB_IP]|DBのIP|
|[DB_PORT]|DBのポート|
|[DB_DBNAME]|使用するDB名|

 <?xml version="1.0" encoding="UTF-8"?>
 <persistence version="1.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_1_0.xsd">
    <persistence-unit name="jpa-sample"
        transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>User</class>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLMyISAMDialect" />
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
            <property name="hibernate.connection.username" value="[DB_ID]" />
            <property name="hibernate.connection.password" value="[DB_PASSWORD]" />
            <property name="hibernate.connection.url" value="jdbc:mysql://[DB_IP]:[DB_PORT]/[DB_DBNAME]" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.use_sql_comments" value="true" />
            
        </properties>
    </persistence-unit>
 </persistence>

** 使用方法 - 実装 [#ycd1e543]
*** Entity Bean [#x982fa42]
ユーザ情報を保持するEntityBeanを作成する.

import java.io.Serializable;

import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.Table;
 
 @Entity
 @Table(name="User")
 public class User implements Serializable {
 	@Id
 	@Column(name="id")
 	private String id;
 	@Column(name="name")
 	private String name;
 	@Column(name="age")
 	private int age;
 	
 	public int getAge() {
 		return age;
 	}
 	public void setAge(int age) {
 		this.age = age;
 	}
 	public String getId() {
 		return id;
 	}
 	public void setId(String id) {
 		this.id = id;
 	}
 	public String getName() {
 		return name;
 	}
 	public void setName(String name) {
 		this.name = name;
 	}
 	
 }

- ''解説''
-- &color(blue){''@Entity''}; - ''Entity Beanであることを定義''
クラス定義の前に「@Entity」を記述し、「Entity Bean」であることを定義する.

-- &color(blue){''@Table(name="User")''}; - ''このEntity Beanとマッピングするテーブル名を定義''
クラス定義の前に「@Table(name="User")」を記述し、name要素にマッピングするテーブル名記述する.
クラス名テーブル名が同じ場合は、「@Table(name="User")」は省略できる.

-- &color(blue){''@Id''}; - ''Primary Keyを定義''
「Primary Key」となるインスタンス変数に定義する.

-- &color(blue){''@Column(name="id")''}; - ''このインスタンス変数とマッピングするカラム名を定義''
インスタンス変数定義の前に「@Column(name="id")」を記述し、name要素にマッピングするカラム名を記述する.
インスタンス変数名とカラム名が同じ場合は、「@Column(name="id")」は省略できる.

*** EntityManager [#t9605dc6]
Entity Beanを管理するEntityManagerを取得する.
 // 永続化
 EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-sample");
 EntityManager entityManager = factory.createEntityManager();

- ''解説''
-- &color(blue){''Persistence.createEntityManagerFactory("jpa-sample");''}; - ''EntityManagerFactoryを取得''
Persistence#createEntityManagerFactory()を使用し、EntityManagerFactoryを取得を取得する.
引数に、設定ファイル「persistence.xml」で記述した「persistence-unit name="jpa-sample"」の「jpa-sample」を渡す.

*** サンプル [#s31d4867]
テストクラスでの使用サンプル(Junit4.4)
 import static org.junit.Assert.*;
 import static org.hamcrest.CoreMatchers.*;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.Persistence;
 
 import org.junit.Test;
 
 public class JpaHibernateTest {
 	
 	@Test
 	public void run() {
 		// 永続化
 		EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-sample");
 		EntityManager entityManager = factory.createEntityManager();
 		
 		// Insert
 		// --------------------------
 		{
 			entityManager.getTransaction().begin();
 			User user = new User();
 			user.setId("id");
 			user.setName("name");
 			user.setAge(10);
 			
 			// Insert処理
 			entityManager.persist(user);
 			
 			// 確認
 			User actual = entityManager.find(User.class, "id");
 			assertThat(actual.getId(), is("id"));
 			assertThat(actual.getName(), is("name"));
 			assertThat(actual.getAge(), is(10));
 			entityManager.getTransaction().rollback();
 		}
 		
 		// Update
 		// --------------------------
 		{
 			entityManager.getTransaction().begin();
 			User user = new User();
 			user.setId("id");
 			user.setName("name");
 			user.setAge(10);
 			// Insert処理
 			entityManager.persist(user);
 			
 			
 			User user2 = new User();
 			user2.setId("id");
 			user2.setName("name2");
 			user2.setAge(20);
 			
 			// Update処理
 			entityManager.merge(user2);
 			
 			// 確認
 			User actual = entityManager.find(User.class, "id");
 			assertThat(actual.getName(), is("name2"));
 			assertThat(actual.getAge(), is(20));
 			entityManager.getTransaction().rollback();
 		}
 		
 		// Delete
 		// --------------------------
 		{
 			entityManager.getTransaction().begin();
 			User user = new User();
 			user.setId("id");
 			user.setName("name");
 			user.setAge(10);
 			entityManager.persist(user);
 			
 			entityManager.remove(user);
 			User actual = entityManager.find(User.class, "id");
 			assertThat(actual, nullValue());
 			entityManager.getTransaction().rollback();
 		}
 		
 		// Select (主キー)
 		// --------------------------
 		{
 			entityManager.getTransaction().begin();
 			User user = new User();
 			user.setId("id");
 			user.setName("name");
 			user.setAge(10);
 			entityManager.persist(user);
 			
 			User actual = entityManager.find(User.class, "id");
 			assertThat(actual.getId(), is("id"));
 			assertThat(actual.getName(), is("name"));
 			assertThat(actual.getAge(), is(10));
 			entityManager.getTransaction().rollback();
 		}
 		
 		// Insert (おまけ)
 		// オブジェクトが同じであれば2回EntityManager#persist()で値を変更できる(Update扱い).
 		// --------------------------
 		{
 			entityManager.getTransaction().begin();
 			User user = new User();
 			user.setId("id");
 			user.setName("name");
 			user.setAge(10);
 			
 			// Insert処理
 			entityManager.persist(user);
 			user.setName("name2");
 			user.setAge(20);
 			entityManager.persist(user);
 			
 			// 確認
 			User actual = entityManager.find(User.class, "id");
 			assertThat(actual.getId(), is("id"));
 			assertThat(actual.getName(), is("name2"));
 			assertThat(actual.getAge(), is(20));
 			entityManager.getTransaction().rollback();
 		}
 	}
 }
- DBアクセス
|Insert|EntityManager#persist(Object[EntityBean]));|
|Update|EntityManager#merge(Object[EntityBean]);|
|Delete|EntityManager#remove(Object[EntityBean]);|
|Select (Primary Key)|EntityManager#find(Class, String[primary key]);|

- トランザクション
//*** Insert
//*** Update
//*** Delete
//*** Select (Primary Key)
//*** トランザクション
|トランザクション開始|EntityManager#getTransaction()#begin();|
|コミット|EntityManager#getTransaction()#commit();|
|ロールバック|EntityManager#getTransaction()#rollback();|
//*** アノテーション一覧

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS