HOME > 技術情報 > Java > Java Persistence API

Java Persistence API 1.0(JPA)

Java Persistence APIとは

特徴

実装プロダクト

Java Persistence APIは仕様であるため、実装プロダクトがいくつか存在する.

使用方法 - 準備 (実装プロダクト:Hibernate)

今回は、実装プロダクトとして、「Hibernate」を使用する.

インストール

設定ファイル - persistence.xml

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>sample.entity.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>

使用方法 - 実装 (単独テーブルへの追加、変更、削除、参照)

Entity Bean

ユーザ情報を保持する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;
	}
	
}

EntityManager

EntityManagerは、Entity Beanの永続性を管理するためのオブジェクト.
EntityManagerは以下のようにして取得する.

// 永続化
EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-sample");
EntityManager entityManager = factory.createEntityManager();

サンプル

データベースへの、新規追加(Insert)、更新(Update)、削除(Delete)、参照(find)のサンプル(Junit4.4).
設定ファイル(persistence.xml)は、上記の設定とする.

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();
		}
	}
}

サンプルダウンロード


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