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:表示しない |
ユーザ情報を保持する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)は、上記の設定とする.
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(); } } }
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(); |