Post on 26-May-2015
description
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 1
WebLogic Server 勉強会 JPA 2.0入門
2013年 3月21日
日本オラクル株式会社
Fusion Middleware事業統括本部 松林晶
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 2
Program Agenda
JPAとは
JPA Demo
JPA2.1 新機能(予定)
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 3
JPAとは
Java Persistence APIの略
Java EE環境に限らず、Java SEでも利用可能
O/Rマッピングの仕様です
– データベースのテーブルのレコードをJavaのオブジェクトに相互変換
– Javaのオブジェクトにアクセスし、データベース操作可能
概要
データベース
Java
Object
マッピング(自動で相互変換)
App
参照 挿入 更新 削除
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 4
JPAとは JPAの歴史
誕生の背景
– EJBの難解さ、O/Rマッピングフレームワーク
JPA1.0(2006年)
– EJB3.0の仕様の一部
– 従来のEntityBeanに代わるものとして策定
JPA2.0(2009年)
– EJBから独立(Java EE 6)
JPA2.1(2013年予定)
– Java EE 7 予定
EntityBeanの
難解さ
O/Rマッピング
フレームワークの台頭
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 5
JPAとは JDBCプログラミング 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(); } }
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 and/or its affiliates. All rights reserved. 6
JPAとは JPAの構成要素
Persistence Context
EntityManager
Persistent Unit
(persistence.xml)
EntityManagerFactory
Entity
Entity
Entity
Entity
Entity
データベース
決定 生成
Persistence Unitの設定に基づき、Entity Managerのインスタンスを生成
データ操作及び管理の為のAPIを提供する
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 7
JPAとは
テーブルに対応したマッピング対象のクラス(=エンティティ)
– ただのPOJO(Plain Old Java Object)で作成
– @Entityアノテーション ⇒ エンティティクラスであることを示す
– @Idアノテーション ⇒ 主キーを示す
エンティティとは
@Entity public class Customer { @Id private Long id; private String address1; private long age; private String name; private String telephone; //セッタ・ゲッタ }
ID ADDRESS1 AGE NAME TELEPHONE
エンティティ
Customerクラス
データベース
CUSTOMER表
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 8
JPAとは エンティティのライフサイクル
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 9
JPAとは エンティティのライフサイクル(コード例)
ライフサイクルのコード例
– エンティティのインスタンスを生成(new)しただけではデータベースには何も反映されない
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 and/or its affiliates. All rights reserved. 10
JPAとは 2種類のエンティティマネージャ
コンテナ管理のエンティティマネージャ(Java EE環境)
– アノテーション、DIにより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 and/or its affiliates. All rights reserved. 11
JPAとは エンティティマネージャ①
データ操作及び管理の為のAPIを提供する。
– ライフサイクル管理のためのAPI
– 検索のためのAPI
persist() エンティティクラスを永続化管理対象にする
(insert対象にする)
remove() エンティティクラスを削除する(delete対象にする)
refresh() データを同期する。データベースのデータでエンティティを上書き
merge() 分離したエンティティをマージする。(管理対象にする)
find() 主キーによるエンティティの検索
getReference() 主キーによるエンティティの検索
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 12
JPAとは エンティティマネージャ②
データ操作及び管理の為のAPIを提供する。
– Query関連のAPI
createQuery() ,createNamedQuery() ,createNativeQuery()
– Persistenceコンテキストの管理API
flush() データを明示的にDBと同期する
clear() エンティティ全てを管理対象から外す
getTransaction() トランザクションの参照を取得
close() アプリケーション管理のエンティティマネージャを終了する
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 13
JPAとは
Java Persistence Query Languageの略
– SQLに似たJPA用のクエリー言語
– SELECT / UPDATE / DELETEなどに対応
– WHERE句、ソート(ORDER BY)、集約(GROUP BY)等も可能
JPQL
SELECT c FROM Customer c WHERE c.lastName = ‘Yamada’ ORDER BY c.id
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 14
JPAとは
JPAのクエリは4種類
1. 動的クエリ
アプリケーション実行時にクエリを定義
2. 名前付きクエリ
動的クエリと異なり、静的で変更できないクエリ
3. ネイティブクエリ
データベース固有の機能を使用するためのクエリ(SQLをそのまま使用可能)
JPQL
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 15
JPAとは
JPAのクエリは4種類
4. Criteria API
JPQLに相当するクエリをAPIベースで記述し型の安全性を確保
JPQL
JPA2.0
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"));
SELECT c FROM Customer c WHERE c.name = ‘Oracle’
JPQL による表記
Criteria API による表記 キャスト時の型チェック
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 16
JPA Demo
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 17
Oracle Enterprise Pack for Eclipse 12cを使用した簡単JPA開発
JPA Demo Oracle Enterprise Pack for Eclipse 12c + WebLogic Server 12c
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 18
JPA2.1 新機能(予定) JSR-338 Java Persistence 2.1 Proposed Final Draft
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 19
JPA2.1 新機能(予定) Java EE 6 から Java EE 7へ そして Java EE 8へ…
Java EE 6 Java EE 8 Java EE 7 2013 ?
2009
進化
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 20
JPA2.1 新機能(予定)
JPAもJava EE 6 から Java EE 7へ
概要
JPA2.0 Java EE 6
JPA2.1 Java EE 7
JPQL/CriteriaAPIの強化 ストアドプロシージャサポート
バルク更新
ON句サポート
他…
JSR 338
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 21
JPA2.1 新機能(予定)
そもそもストアドプロシージャって…
– データベースに対する一連の処理をまとめた一つのプログラム(データベースに保存)
– クライアントから引数を渡して処理を実行、処理結果を返すことができる
ストアドプロシージャのサポート①
WebLogic
Server
A実行命令!
処理結果等
PROCEDURE A( i_param IN NUMBER, o_param OUT NUMBER)
データベース アプリケーション
サーバ
引数
戻り値
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 22
JPA2.1 新機能(予定)
定義済み関数 + ユーザ定義関数の呼び出し可能
– 実装例
ストアドプロシージャのサポート②
// ①エンティティマネージャからストアドプロシージャを作成する StoredProcedreQuery query = EntityManager.createNamedStoredProcedureQuery(“topGiftsStoredProcedure”); // ②引数の設定 query.registerStoredProcedureParameter(1, String.class, ParameterMode.INOUT); query.setParameter(1, “top10”); query.registerStoredProcedureParameter(2, Integer.class, ParameterMode.IN); query.setParameter(2, 100); // ③ストアドプロシージャの実行 query.execute(); // ④アウトプットパラメータの1を取得 String response = query.getOutputParameterValue(1);
ストアドプロシージャ呼び出し側(セッションBean等) ストアドプロシージャのインスタンスを作成する。
実行前に、パラメータのセットをしておくこ
プロシージャの戻り値は単数もしくはObjectの配列で返す
パラメータの登録
全てのパラメータは登録されなくてはならない
第1パラメータは、String型で双方向
OUTパラメータ(戻り値)の取得
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 23
JPA2.1 新機能(予定) ストアドプロシージャのサポート③ 【参考情報】Javadoc
JCPのWebサイトにてJavadoc公開
javax.persistence
Interface StoredProcedureQuery
javax.persistence
Interface EntityManager
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 24
JPA2.1 新機能(予定)
CriteriaAPIでバルク(一括)更新のサポート
– CriteriaBuilderにcreateCriteriaUpdate()メソッド追加
– javax.persistence.criteria.CriteriaUpdateインターフェースの追加
実装例
CriteriaAPIでバルク削除のサポート
– CriteriaBuilderにcreateCriteriaDeleteメソッド追加
– javax.persistence.criteria.CriteriaDeleteインターフェースの追加
バルク更新 / バルク削除のサポート
CriteriaUpdate<Customer> q = cb.createCriteriaUpdate(Customer.class); Root<Customer> c = q.from(Customer.class); q.set(c.get(Customer_.status), "outstanding") .where(cb.lt(c.get(Customer_.balance), 10000)); UPDATE Customer c
SET c.status = 'outstanding' WHERE c.balance < 10000
一緒
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 25
JPA2.1 新機能(予定)
ON句のサポート
– ON句はJOINの結合条件を記述する
– 連動して、Criteria APIにon() getOn() メソッドの追加
JPQLの機能強化
SELECT s.name, COUNT(p) FROM Suppliers s LEFT JOIN s.products p ON p.status = 'inStock' GROUP BY s.name
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 26
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 27