HOME > 技術情報 > Java > Java Persistence API Java Persistence API 1.0(JPA) †Java Persistence APIとは †
特徴 †
実装プロダクト †Java Persistence APIは仕様であるため、実装プロダクトがいくつか存在する.
使用方法 - 準備 (実装プロダクト:Hibernate) †今回は、実装プロダクトとして、「Hibernate」を使用する. インストール †
設定ファイル - persistence.xml †persistence.xmlと言うファイルを作成し、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>
使用方法 - 実装 (単独テーブルへの追加、変更、削除、参照) †以下のテーブルを操作するサンプルを作成する.
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の永続性を管理するためのオブジェクト. // 永続化 EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-sample"); EntityManager entityManager = factory.createEntityManager();
hibernate.hbm2ddl.autoによるDDL †create table User ( id varchar(255) not null, age integer not null, name varchar(255), primary key (id) ) type=MyISAM サンプル †データベースへの、新規追加(Insert)、更新(Update)、削除(Delete)、参照(find)のサンプル(Junit4.4). 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)); } }
サンプルダウンロード †使用方法 - 実装 (1対多、多対1) †以下のテーブルを操作するサンプルを作成する.
テーブル名:OrderInfoDetail
Entity Bean †「@Table」と「@Column」アノテーションは省略するため、 package sample2.entity; import java.io.Serializable; import java.util.Date; import java.util.List; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OneToMany; @Entity public class OrderInfo implements Serializable { @Id private int id; private Date date; @OneToMany(mappedBy="orderInfo") private List<OrderInfoDetail> orderDetailList; public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public int getId() { return id; } public void setId(int id) { this.id = id; } public List<OrderInfoDetail> getOrderDetailList() { return orderDetailList; } public void setOrderDetailList(List<OrderInfoDetail> orderDetailList) { this.orderDetailList = orderDetailList; } }
package sample2.entity; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToOne; @Entity public class OrderInfoDetail implements Serializable { @Id private int id; private String productName; private int productPrice; private int quantity; @ManyToOne private OrderInfo orderInfo; public int getId() { return id; } public void setId(int id) { this.id = id; } public OrderInfo getOrderInfo() { return orderInfo; } public void setOrderInfo(OrderInfo orderInfo) { this.orderInfo = orderInfo; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public int getProductPrice() { return productPrice; } public void setProductPrice(int productPrice) { this.productPrice = productPrice; } public int getQuantity() { return quantity; } public void setQuantity(int quantity) { this.quantity = quantity; } }
persistence.xml †上記persistence.xmlに以下を追記 <persistence-unit name="jpa-sample2" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <class>sample2.entity.OrderInfo</class> <class>sample2.entity.OrderInfoDetail</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="taadmin" /> <property name="hibernate.connection.password" value="trance" /> <property name="hibernate.connection.url" value="jdbc:mysql://192.168.3.150:3306/jpasample2" /> <property name="hibernate.hbm2ddl.auto" value="create-drop" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> <property name="hibernate.use_sql_comments" value="false" /> </properties> </persistence-unit> hibernate.hbm2ddl.autoによるDDL †create table OrderInfo ( id integer not null, date datetime, primary key (id) ) type=MyISAM create table OrderInfoDetail ( id integer not null, productName varchar(255), productPrice integer not null, quantity integer not null, orderInfo_id integer, primary key (id) ) type=MyISAM alter table OrderInfoDetail add index FKFD49806D9973955 (orderInfo_id), add constraint FKFD49806D9973955 foreign key (orderInfo_id) references OrderInfo (id) サンプル †package sample2; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import java.util.Date; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.junit.Test; import sample2.entity.OrderInfo; import sample2.entity.OrderInfoDetail; public class JpaHibernateTest2 { private static final String PERSISTENCE_UNIT_NAME = "jpa-sample2"; @Test public void oneToMany() { // 永続化 // ------------------------------ EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); EntityManager entityManager = factory.createEntityManager(); // データの追加 // ************************************ // EntityBeanをnew // ライフサイクル:new // ------------------------------ Date InsertDate = new Date(); OrderInfo order = new OrderInfo(); order.setId(1); order.setDate(InsertDate); OrderInfoDetail detail1 = new OrderInfoDetail(); detail1.setId(1); detail1.setOrderInfo(order); detail1.setProductName("商品名1"); detail1.setProductPrice(1000); detail1.setQuantity(1); OrderInfoDetail detail2 = new OrderInfoDetail(); detail2.setId(2); detail2.setOrderInfo(order); detail2.setProductName("商品名2"); detail2.setProductPrice(2000); detail2.setQuantity(2); // Insert // ライフサイクル:managed // ------------------------------ entityManager.getTransaction().begin(); entityManager.persist(order); entityManager.persist(detail1); entityManager.persist(detail2); entityManager.getTransaction().commit(); // 管理していたEntityBeanをクリア // ライフサイクル:detached // ------------------------------ entityManager.clear(); // Select // ライフサイクル:managed // ------------------------------ OrderInfo actual = entityManager.find(OrderInfo.class, 1); // 確認 // ************************************ assertThat(actual.getId(), is(1)); List<OrderInfoDetail> orderDetailList = actual.getOrderDetailList(); assertThat(orderDetailList.size(), is(2)); OrderInfoDetail actualDetail1 = orderDetailList.get(0); assertThat(actualDetail1.getId(), is(detail1.getId())); assertThat(actualDetail1.getProductName(), is(detail1.getProductName())); assertThat(actualDetail1.getProductPrice(), is(detail1.getProductPrice())); assertThat(actualDetail1.getQuantity(), is(detail1.getQuantity())); OrderInfoDetail actualDetail2 = orderDetailList.get(1); assertThat(actualDetail2.getId(), is(detail2.getId())); assertThat(actualDetail2.getProductName(), is(detail2.getProductName())); assertThat(actualDetail2.getProductPrice(), is(detail2.getProductPrice())); assertThat(actualDetail2.getQuantity(), is(detail2.getQuantity())); } @Test public void ManyToOne() { // 永続化 // ------------------------------ EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); EntityManager entityManager = factory.createEntityManager(); // データの追加 // ************************************ // EntityBeanをnew // ライフサイクル:new // ------------------------------ Date InsertDate = new Date(); OrderInfo order = new OrderInfo(); order.setId(1); order.setDate(InsertDate); OrderInfoDetail detail1 = new OrderInfoDetail(); detail1.setId(1); detail1.setOrderInfo(order); detail1.setProductName("商品名1"); detail1.setProductPrice(1000); detail1.setQuantity(1); OrderInfoDetail detail2 = new OrderInfoDetail(); detail2.setId(2); detail2.setOrderInfo(order); detail2.setProductName("商品名2"); detail2.setProductPrice(2000); detail2.setQuantity(2); // Insert // ライフサイクル:managed // ------------------------------ entityManager.getTransaction().begin(); entityManager.persist(order); entityManager.persist(detail1); entityManager.persist(detail2); entityManager.getTransaction().commit(); // 管理していたEntityBeanをクリア // ライフサイクル:detached // ------------------------------ entityManager.clear(); // Select // ライフサイクル:managed // ------------------------------ OrderInfoDetail actual = entityManager.find(OrderInfoDetail.class, 1); // 確認 // ************************************ assertThat(actual.getId(), is(detail1.getId())); assertThat(actual.getProductName(), is(detail1.getProductName())); assertThat(actual.getProductPrice(), is(detail1.getProductPrice())); assertThat(actual.getQuantity(), is(detail1.getQuantity())); OrderInfo actualOrder = actual.getOrderInfo(); assertThat(actualOrder.getId(), is(order.getId())); } }
OrderInfoDetail
サンプルダウンロード † |