Java EE 6 かんたんO/Rマッピング JPA2.0入門
-
Upload
oracle-fusion-middleware -
Category
Technology
-
view
10.813 -
download
1
description
Transcript of Java EE 6 かんたんO/Rマッピング JPA2.0入門
<Insert Picture Here>
第24回WebLogic Server勉強会@東京
「Java EE 6 かんたんO/Rマッピング JPA2.0入門」
日本オラクル株式会社 Fusion Middleware事業統括本部 ソリューション本部 シニアセールスコンサルタント 松林 晶
Copyright© 2012, Oracle. All rights reserved. 2
以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。
OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Agenda
3
1. JPAとは
2. JPA2.0新機能
3. JPAかんたん開発(DEMO) (with Oracle Enterprise Pack for Eclipse)
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
4
JPAとは
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
JPAとは
5
• O/Rマッピングの仕様です • データベースのテーブルのレコードをJavaのオブジェクトに相互変換
• Javaのオブジェクトにアクセスし、データベース操作可能
Database
Java
Object
マッピング(自動で相互変換)
App
•参照
•挿入
•更新
•削除
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
JPAとは
6
• JPA以外のO/Rマッピングフレームワーク
# 名称
1 Hibernate
2 myBatis(旧iBatis)
3 Entity Bean(EJB2.*)
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
JDBCプログラミング
7
• O/Rマッピングフレームワークを使用しない場合の JDBCプログラミング例(参照系の処理)
• JDBCドライバクラスの指定
• コネクションの確保及びクローズ処理
• クエリー文の記述
• エラーハンドリング
• Beanオブジェクトへの値の設定(O/Rマッピング)
package jdbc; import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import model.Employee; public class MainJDBC { public static void main(String[] args) { Connection con = null; PreparedStatement stm = null; try { Class.forName(“oracle.jdbc.OracleDriver”); con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "HR", "hr"); stm = con.prepareStatement("SELECT * FROM Employees e WHERE e.EMPLOYEE_ID = ?"); stm.setInt(1, 100); ResultSet rSet = stm.executeQuery(); if (rSet.next()) { Employee emp = new Employee(); emp.setEmployeeId(rSet.getLong("EMPLOYEE_ID")); emp.setLastName(rSet.getString("LAST_NAME")); emp.setFirstName(rSet.getString("FIRST_NAME")); emp.setEmail(rSet.getString("EMAIL")); emp.setPhoneNumber(rSet.getString("PHONE_NUMBER")); emp.setHireDate(rSet.getDate("HIRE_DATE")); emp.setJobId(rSet.getString("JOB_ID")); emp.setSalary(BigDecimal.valueOf(rSet.getLong("SALARY"))); emp.setCommissionPct(BigDecimal.valueOf(rSet.getLong("COMMISSION_PCT"))); emp.setDepartmentId(BigDecimal.valueOf(rSet.getLong("DEPARTMENT_ID"))); System.out.println(emp); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (stm != null) stm.close(); if (con != null) con.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
大量のコードを記述する必要あり
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
JPAの例
8
• JPAを使用したプログラミング例
package jdbc; import javax.persistence.EntityManager; import javax.persistence.Persistence; import model.Employee; public class MainJPA { public static void main(String[] args) { EntityManager em = Persistence.createEntityManagerFactory("db").createEntityManager(); Employee emp = em.find(Employee.class, 100L); System.out.println(emp); em.close(); } }
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
【参考】Hibernateの例
9
• 【参考】Hibernateを使用したプログラミング例
package jdbc; import model.Employee; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class MainHibernate { public static void main(String[] args) { SessionFactory factory = new Configuration().configure().buildSessionFactory(); Session session = factory.openSession(); System.out.println(session.get(Employee.class , 100L)); session.close(); } }
Copyright© 2012, Oracle. All rights reserved.
Persistence Context
EntityManager
Java EE 6 かんたんO/Rマッピング JPA2.0入門
JPA構成要素
10
• JPAの構成要素
Persistent Unit
(persistence.xml)
EntityManagerFactory
Entity
Entity
Entity
Entity
Entity
Database
決定 生成
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Persistence Unit
11
• persistence.xmlに記述
• データベースとの接続設定を記述
• エンティティクラスの指定
• トランザクションタイプの指定(RESOURCE_LOCAL/JTA)
• etc
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
EntityManagerFactory
12
• Persistence Unitの設定に基づき、Entity Managerのインスタンスを生成
EntityManager em = Persistence.createEntityManagerFactory("db").createEntityManager();
<persistence-unit name=“db“>
<…>
persistence.xml
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
EntityManager
13
• データ操作及び管理の為のAPIを提供する。
• ライフサイクル管理のためのAPI
• persist() ⇒ エンティティクラスを永続化管理対象にする(insert/update対象にする)
• remove() ⇒ エンティティクラスを削除する(delete対象にする)
• refresh() ⇒ データを同期する。データベースのデータでエンティティを上書きする。
• merge() ⇒ 分離したエンティティをマージする。
• 検索のためのAPI
• find() , getReference()⇒ 主キーによるエンティティの検索
• Query関連のAPI
• createQuery() ,createNamedQuery() ,createNativeQuery()
• Persistenceコンテキストの管理API
• flush() ⇒ データを明示的にDBと同期する
• clear() ⇒ エンティティ全てを管理対象から外す
• getTransaction() ⇒ トランザクションの参照を取得
• close()
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
2種類のEntityManager
14
• コンテナ管理のEntityManager ⇒ Java EEコンテナで管理
• アノテーション、DIによりEntityManagerをインスタンスを注入
• コンテナがトランザクションを管理する
• アプリケーション管理のEntityManager ⇒ アプリケーションで管理。Java SE/EEで使用
• Factoryメソッドを使用して、EntityManagerを取得
• アプリケーション側でトランザクションを管理のためのコーディングが必要
@PersistenceContext(unitname = “DB”) private EntityManager entityManager;
EntityManagerFactory emf = Persistence.createEntityManagerFactory(“DB"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); em.persist(customer); tx.commit(); em.close(); emf.close();
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
エンティティのライフサイクル
15
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
エンティティのライフサイクル(コード例)
16
EntityManagerFactory emf = Persistence.createEntityManagerFactory(”DB");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
Customer customer = new Customer(); //Entityの生成
tx.begin();
em.persist(customer); //管理状態のEntity
tx.commit(); //デタッチ状態になるEntity
//JavaのHeapにはcustomerは存在するが、JPAの管理状態から外れデタッチ状態
//この状態でcustomerに対する操作を行った場合は、merge()で同期
em.close();
emf.close();
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Entity①
17
• テーブルに対応したエンティティクラス
• ただのPOJO(Plain Old Java Object)で作成
• @Entityアノテーション ⇒ O/Rマッピング対象のエンティティクラスであることを示す
• @Idアノテーション ⇒ 主キーを示す
@Entity public class Customer implements Serializable { @Id private Long id; private String address1; private long age; private String name; private String telephone; //セッタ・ゲッタ }
ID ADDRESS1 AGE NAME TELEPHONE
テーブル
CUSTOMER表
エンティティクラス
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Entity②
18
• デフォルトのカラムの上書き
@Entity public class Customer implements Serializable { @Id private Long id; @NotNull //入力必須 @Size(min = 1, max = 512) //入力サイズの変更 @Column(name = ”FULL_ADDRESS“) //デフォルトのカラム名をFULL_ADDRESSに変更 private String address1; private long age; private String name; private String telephone; //セッタ・ゲッタ }
エンティティクラス
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Entity③
19
• 遅延読み込み
@Entity public class Customer implements Serializable { @Id private Long id; private String address1; private long age; private String name; private String telephone; @Basic(fetch = FetchType.LAZY)//写真の取得要求があるまで遅らせる @Lob private byte[] picture; }
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
JPQL
20
• Java Persistence Query Languageの略
• SQLに似たJPA用のクエリー言語
• SELECT / UPDATE / DELETEなどに対応
• WHERE句、ソート(ORDER BY)、集約(GROUP BY)等も可能
SELECT c FROM Customer c WHERE c.lastName = 'Yamada'
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
クエリ
21
• JPAのクエリは4種類
• 動的クエリ
• アプリケーション実行時にクエリを定義
• 名前付きクエリ
• 動的クエリと異なり、静的で変更できないクエリ
• ネイティブクエリ
• データベース固有の機能を使用するためのクエリ(SQLをそのまま使用可能)
• Criteria API(JPA2.0新機能)
Query q = em.createNativeQuery(“SELECT * FROM T_PERSON”, Person.class); List<Person> persons = q.getResultList();
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
22
JPA2.0新機能
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
JPA2.0新機能①
23
• データアクセス制御の強化
• 楽観的ロックに加え悲観的ロックの追加
• 検索結果のソートとソート結果の保持
• DBレコードの連鎖削除(カスケード削除)
• JPQL演算子の追加(INDEX / CASE / TYPE、etc.)
• 2次キャッシュの標準仕様化
MyEntity men = new MyEntity();
em.persist(men);
em.lock(men,LockModeType.PESSIMISTIC_WRITE)
@Entity public class Order {
@OneToMany(Cascade=PERSIST, orphanRemovable=true)
private List<Meisai> meisaiList;
//...
}
コーディングで補っていた不足機能をより一層拡充
エンティティの悲観的ロック
カスケード削除の指定 meisaiList削除時にリスト内のEntityに対応するレコードもDBから削除
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
JPA2.0新機能②
24
• コレクションサポートの拡充
• 基本型のコレクションのテーブルへのマッピング
• 組み込み可能型コレクションのマッピング
• 多段にネストされた組み込み型もマッピング可能
• Map型コレクションの柔軟性向上
• キー、値に基本型、組み込み可能型、Entity型を利用可能
• Criteria APIによるクエリの記述
• JPQLに相当するクエリをAPIベースで記述し型の安全性を確保
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Customer> query = builder.createQuery(Customer.class);
Root<Customer> c = query.from(Customer.class);
query.select(c).where(builder.equal(c.get("name"), "Oracle"));
@Embeddable
public class Address {
private String zip;
private String street;
}
@Entity
public class Customer {
private String id;
@ElementCollection
private Set<Address> addrs;
}
組み込み可能型を自動で ‘Customer_addrs’ テーブルにマップ(任意にテーブルの指定も可能)
可読性を高め品質の劣化を未然に防止
SELECT c FROM Customer c
WHERE c.name = ‘Oracle’
JPQL による表記
Criteria API による表記 キャスト時の型チェック
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
25
JPAかんたん開発DEMO (with Oracle Enterprise Pack for Eclipse)
Copyright© 2012, Oracle. All rights reserved.
Java EE 6 かんたんO/Rマッピング JPA2.0入門
JPAかんたん開発DEMO
26
• Oracle Enterprise Pack for Eclipse12.1(OEPE)を使用して Entityクラスを、定義済みのデータベースから自動生成します。
@Entity public class Customer implements Serializable { @Id private Long id; private String address1; private long age; private String name; private String telephone; //セッタ・ゲッタ }
ID ADDRESS1 AGE NAME TELEPHONE
自動生成
Copyright© 2012, Oracle. All rights reserved.
Copyright© 2012, Oracle. All rights reserved. 28