|
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
サンプルダウンロード † |