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