HOME > 技術情報 > Java > Java Persistence API
| 状態 | 説明 | Persistent Indentity | Persistence Context |
|---|---|---|---|
| new | Entityが生成された状態 | 持たない | 結びつきなし |
| managed | EntityがEntityManagerに管理されている状態 | 持つ | 結びつきあり |
| removed | Entityが削除予約となっている状態 | 持つ | 結びつきあり |
| detached | Entityがデータベースと関連がなくなった状態 | 持つ | 結びつきなし |
Java Persistence APIは仕様であるため、実装プロダクトがいくつか存在する.
今回は、実装プロダクトとして、「Hibernate」を使用する.
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>
| <property>タグのname属性値 | 説明 |
|---|---|
| hibernate.dialect | 使用するDBクラス |
| hibernate.connection.driver_class | DBドライバクラス |
| hibernate.connection.username | ユーザ名 |
| hibernate.connection.password | パスワード |
| hibernate.connection.url | DBのURL |
| hibernate.hbm2ddl.auto | 自動的にDDLを有効にしデータベース出力する validate: update: create: create-drop: |
| hibernate.show_sql | ログにSQLを表示するか true:表示する false:表示しない |
| hibernate.format_sql | ログに表示したSQLをフォーマットするか true:フォーマットする false:フォーマットしない |
| hibernate.use_sql_comments | SQLコメントを表示するか true:表示する false:表示しない |
以下のテーブルを操作するサンプルを作成する.
テーブル名:User
| フィールド | 種別 | 主キー |
|---|---|---|
| id | varchar(255) | ● |
| age | int(11) | |
| name | varchar(255) |
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は、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));
}
}
| Insert | EntityManager#persist(Object[EntityBean])); |
| Update | EntityManager#merge(Object[EntityBean]); |
| Delete | EntityManager#remove(Object[EntityBean]); |
| Select (Primary Key) | EntityManager#find(EntityClass, String[primary key]); |
| トランザクション開始 | EntityManager#getTransaction()#begin(); |
| コミット | EntityManager#getTransaction()#commit(); |
| ロールバック | EntityManager#getTransaction()#rollback(); |