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>

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

以下のテーブルを操作するサンプルを作成する.
テーブル名:User

フィールド種別主キー
idvarchar(255)
ageint(11)
namevarchar(255)

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)は、上記の設定とする.

package sample;
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;

import sample.entity.User;

public class JpaHibernateTest {
	private static final String PERSISTENCE_UNIT_NAME = "jpa-sample1";
	
	/**
	 * 新規追加(Insert)
	 */
	@Test
	public void insert() {
		// 永続化
		// ------------------------------
		EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
		EntityManager entityManager = factory.createEntityManager();
		
		// データの追加
		// ************************************
		
		// EntityBeanをnew 
		// ライフサイクル:new
		// ------------------------------
		User user = new User();
		user.setId("1");
		user.setName("Insert");
		user.setAge(10);
	
		// Insert
		// ライフサイクル:managed
		// ------------------------------
		entityManager.getTransaction().begin();
		entityManager.persist(user);
		entityManager.getTransaction().commit();
		
		// 管理していたEntityBeanをクリア
		// ライフサイクル:detached
		// ------------------------------		
		entityManager.clear();
	
		
		// 確認
		// ************************************
		User actual = entityManager.find(User.class, "1");
		assertThat(actual.getId(), is("1"));
		assertThat(actual.getName(), is("Insert"));
		assertThat(actual.getAge(), is(10));
	}

	/**
	 * 更新(Update)
	 */
	@Test
	public void update() {
		// 永続化
		// ------------------------------
		EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
		EntityManager entityManager = factory.createEntityManager();
		
		// データの追加
		// ************************************
		
		// EntityBeanをnew 
		// ライフサイクル:new
		// ------------------------------
		User user = new User();
		user.setId("1");
		user.setName("Insert");
		user.setAge(10);
	
		// Insert
		// ライフサイクル:managed
		// ------------------------------
		entityManager.getTransaction().begin();
		entityManager.persist(user);
		entityManager.getTransaction().commit();
		
		// 管理していたEntityBeanをクリア
		// ライフサイクル:detached
		// ------------------------------		
		entityManager.clear();
	
		
		// データの更新
		// ************************************
		
		// Select
		// ライフサイクル:managed
		// ------------------------------				
		User user2 = entityManager.find(User.class, "1");
		user2.setName("Update");
		
		// Update
		// ライフサイクル:managed
		// ------------------------------		
		entityManager.getTransaction().begin();
		entityManager.merge(user2);
		entityManager.getTransaction().commit();
	
		// 管理していたEntityBeanをクリア
		// ライフサイクル:detached
		// ------------------------------		
		entityManager.clear();
		
		
		// 確認
		// ************************************
		User actual = entityManager.find(User.class, "1");
		assertThat(actual.getName(), is("Update"));
	}

	/**
	 * 削除(Delete)
	 */
	@Test
	public void delete() {
		// 永続化
		// ------------------------------
		EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
		EntityManager entityManager = factory.createEntityManager();
		
		// データの追加
		// ************************************
		
		// EntityBeanをnew 
		// ライフサイクル:new
		// ------------------------------
		User user = new User();
		user.setId("1");
		user.setName("Insert");
		user.setAge(10);

		// Insert
		// ライフサイクル:managed
		// ------------------------------
		entityManager.getTransaction().begin();
		entityManager.persist(user);
		entityManager.getTransaction().commit();
		
		// 管理していたEntityBeanをクリア
		// ライフサイクル:detached
		// ------------------------------		
		entityManager.clear();

		
		// データの削除
		// ************************************
		
		// Select
		// ライフサイクル:managed
		// ------------------------------				
		User user2 = entityManager.find(User.class, "1");
		
		// Delete
		// ライフサイクル:removed
		// ------------------------------		
		entityManager.getTransaction().begin();
		entityManager.remove(user2);
		entityManager.getTransaction().commit();

		// 管理していたEntityBeanをクリア
		// ライフサイクル:detached
		// ------------------------------		
		entityManager.clear();
		
		
		// 確認
		// ************************************
		User actual = entityManager.find(User.class, "1");
		assertThat(actual, nullValue());
	}

	/**
	 * 主キーによる参照(Select)
	 */
	@Test
	public void selectByPk() {
		// 永続化
		// ------------------------------
		EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
		EntityManager entityManager = factory.createEntityManager();
		
		// データの追加
		// ************************************
		
		// EntityBeanをnew 
		// ライフサイクル:new
		// ------------------------------
		User user = new User();
		user.setId("1");
		user.setName("Insert");
		user.setAge(10);
	
		// Insert
		// ライフサイクル:managed
		// ------------------------------
		entityManager.getTransaction().begin();
		entityManager.persist(user);
		entityManager.getTransaction().commit();
		
		// 管理していたEntityBeanをクリア
		// ライフサイクル:detached
		// ------------------------------		
		entityManager.clear();
	
		
		// Select
		// ライフサイクル:managed
		// ------------------------------
		User actual = entityManager.find(User.class, "1");
		
		// 確認
		// ************************************
		assertThat(actual.getId(), is("1"));
		assertThat(actual.getName(), is("Insert"));
		assertThat(actual.getAge(), is(10));
	}
}

サンプルダウンロード


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