[[HOME>http://www.trance.co.jp/]] > [[技術情報]] > [[Java>http://www.trance.co.jp/wiki/index.php?%B5%BB%BD%D1%BE%F0%CA%F3#xe479566]] > Java Persistence API * Java Persistence API 1.0(JPA) [#p067abdd] #contents ** Java Persistence APIとは [#ye590c98] - Javaオブジェクトの永続化のためのAPI 以前はEJBの仕様に含まれていたものが、EJB3.0より切り離され、EJBコンテナ以外での使用が可能となった. また、O/Rマッピング、アノテーションを使用することにより、以前のEJBのような複雑な仕組みではなく、よりPOJOとして開発できるようになった. // ** 特徴 // - アノテーションによるマッピング → XML設定ファイル減 // - 4つのエンティティ状態 // -- new // -- managed // -- detached // -- removed // - ** 実装プロダクト [#h478525f] Java Persistence APIは仕様であるため、実装プロダクトがいくつか存在する. - Hibernate - TopLink - OpenJPA ** 使用方法 - 準備 (実装プロダクト:Hibernate) [#hc112776] 今回は、実装プロダクトとして、「Hibernate」を使用する. *** インストール [#zf7238d6] - ''ダウンロード'' 以下のサイトより、3つのパッケージをダウンロードする. サイト:http://www.hibernate.org/ パッケージ (2007/09/13時点) -- Hibernate Core 3.2.5.ga -- Hibernate Annotations 3.3.0 GA -- Hibernate EntityManager 3.3.1 GA - ''クラスパスを通す'' それぞれのパッケージは多くのライブラリに依存しているため、必要なライブラリ全てクラスパスを通す. 必要であるかは、同封のドキュメントにて確認する. 今回は実行時に必要なライブラリのみパスを通す. -- Hibernate Core 3.2.5.ga --- jta.jar --- commons-logging-1.0.4.jar --- xml-apis.jar --- asm-attrs.jar --- dom4j-1.6.1.jar --- antlr-2.7.6.jar --- cglib-2.1.3.jar --- asm.jar --- jdbc2_0-stdext.jar --- xerces-2.6.2.jar --- jaxen-1.1-beta-7.jar --- commons-collections-2.1.1.jar --- javassist.jar --- hibernate3.jar -- Hibernate Annotations 3.3.0 GA --- hibernate-annotations.jar --- ejb3-persistence.jar --- hibernate-commons-annotations.jar -- Hibernate EntityManager 3.3.1 GA --- hibernate-entitymanager.jar --- hibernate-validator.jar --- jboss-archive-browsing.jar *** 設定ファイル - persistence.xml [#k3cbb4f0] &color(blue){''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> - ''解説'' -- &color(blue){''<class>''}; - ''EntityBeanクラスの定義'' パッケージ名を含むクラス名を定義することで、JPAで使用するEntityBeanとみなされる. -- &color(blue){''<properties>''}; - ''JDBC接続情報の定義'' Hibernateの''<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を有効にしデータベース出力する&br;validate:&br;update:&br;create:&br;create-drop:| |hibernate.show_sql|ログにSQLを表示するか&br;true:表示する&br;false:表示しない| |hibernate.format_sql|ログに表示したSQLをフォーマットするか&br;true:フォーマットする&br;false:フォーマットしない| |hibernate.use_sql_comments|SQLコメントを表示するか&br;true:表示する&br;false:表示しない| ** 使用方法 - 実装 [#ycd1e543] *** Entity Bean [#x982fa42] ユーザ情報を保持する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; } } - ''解説'' -- &color(blue){''@Entity''}; - ''Entity Beanであることを定義'' クラス定義の前に「@Entity」を記述し、「Entity Bean」であることを定義する. -- &color(blue){''@Table(name="User")''}; - ''このEntity Beanとマッピングするテーブル名を定義'' クラス定義の前に「@Table(name="User")」を記述し、name要素にマッピングするテーブル名記述する. クラス名テーブル名が同じ場合は、「@Table(name="User")」は省略できる. -- &color(blue){''@Id''}; - ''Primary Keyを定義'' 「Primary Key」となるインスタンス変数に定義する. -- &color(blue){''@Column(name="id")''}; - ''このインスタンス変数とマッピングするカラム名を定義'' インスタンス変数定義の前に「@Column(name="id")」を記述し、name要素にマッピングするカラム名を記述する. インスタンス変数名とカラム名が同じ場合は、「@Column(name="id")」は省略できる. *** EntityManager [#t9605dc6] Entity Beanを管理するEntityManagerを取得する. // 永続化 EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-sample"); EntityManager entityManager = factory.createEntityManager(); - ''解説'' -- &color(blue){''Persistence.createEntityManagerFactory("jpa-sample");''}; - ''EntityManagerFactoryを取得'' Persistence#createEntityManagerFactory()を使用し、EntityManagerFactoryを取得する. 引数に、設定ファイル「persistence.xml」で記述した「persistence-unit name="jpa-sample"」の「jpa-sample」を渡す. *** サンプル [#s31d4867] テストクラスでの使用サンプル(Junit4.4) 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(); } } } - ''解説'' -- &color(blue){''DBアクセス''}; |Insert|EntityManager#persist(Object[EntityBean]));| |Update|EntityManager#merge(Object[EntityBean]);| |Delete|EntityManager#remove(Object[EntityBean]);| |Select (Primary Key)|EntityManager#find(EntityClass, String[primary key]);| -- &color(blue){''トランザクション''}; |トランザクション開始|EntityManager#getTransaction()#begin();| |コミット|EntityManager#getTransaction()#commit();| |ロールバック|EntityManager#getTransaction()#rollback();| *** サンプルダウンロード [#ffb1d2a1] - [[hibernate-sample.zip [6.08MB]>http://www.trance.co.jp/wiki/index.php?d=hibernate-sample.zip]] //** アノテーション一覧 [#jd01ea3f] //|@Entity|| //|@Id|| //|@Column||