27
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 1 WebLogic Server 勉強会 JPA 2.0入門 2013321日本オラクル株式会社 Fusion Middleware事業統括本部 松林晶

Java Persistence API入門

Embed Size (px)

DESCRIPTION

JPAはO/RマッピングのAPIで、Java EEの標準仕様にも含まれています。アプリケーションのデータアクセス層開発を簡単にするだけでなく、Eclipse(OEPE 12c)やWebLogic Server 12cと組み合わせることで、より効率の良い開発を行う ことができます。JPAの基本から簡単な開発手順を解説します。 日本オラクル株式会社 Fusion Middleware事業統括本部 ソリューション本部 松林 晶

Citation preview

Page 1: Java Persistence API入門

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 1

WebLogic Server 勉強会 JPA 2.0入門

2013年 3月21日

日本オラクル株式会社

Fusion Middleware事業統括本部 松林晶

Page 2: Java Persistence API入門

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 2

Program Agenda

JPAとは

JPA Demo

JPA2.1 新機能(予定)

Page 3: Java Persistence API入門

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

参照 挿入 更新 削除

Page 4: Java Persistence API入門

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マッピング

フレームワークの台頭

Page 5: Java Persistence API入門

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(); }

コード量大幅削減

Page 6: Java Persistence API入門

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を提供する

Page 7: Java Persistence 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表

Page 8: Java Persistence API入門

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 8

JPAとは エンティティのライフサイクル

Page 9: Java Persistence API入門

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();

Page 10: Java Persistence API入門

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();

Page 11: Java Persistence API入門

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 11

JPAとは エンティティマネージャ①

データ操作及び管理の為のAPIを提供する。

– ライフサイクル管理のためのAPI

– 検索のためのAPI

persist() エンティティクラスを永続化管理対象にする

(insert対象にする)

remove() エンティティクラスを削除する(delete対象にする)

refresh() データを同期する。データベースのデータでエンティティを上書き

merge() 分離したエンティティをマージする。(管理対象にする)

find() 主キーによるエンティティの検索

getReference() 主キーによるエンティティの検索

Page 12: Java Persistence API入門

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() アプリケーション管理のエンティティマネージャを終了する

Page 13: Java Persistence API入門

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

Page 14: Java Persistence API入門

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 14

JPAとは

JPAのクエリは4種類

1. 動的クエリ

アプリケーション実行時にクエリを定義

2. 名前付きクエリ

動的クエリと異なり、静的で変更できないクエリ

3. ネイティブクエリ

データベース固有の機能を使用するためのクエリ(SQLをそのまま使用可能)

JPQL

Page 15: Java Persistence API入門

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 による表記 キャスト時の型チェック

Page 16: Java Persistence API入門

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 16

JPA Demo

Page 17: Java Persistence API入門

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

Page 18: Java Persistence API入門

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 18

JPA2.1 新機能(予定) JSR-338 Java Persistence 2.1 Proposed Final Draft

Page 19: Java Persistence API入門

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

進化

Page 20: Java Persistence API入門

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

Page 21: Java Persistence API入門

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)

データベース アプリケーション

サーバ

引数

戻り値

Page 22: Java Persistence API入門

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パラメータ(戻り値)の取得

Page 23: Java Persistence API入門

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

Page 24: Java Persistence API入門

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

一緒

Page 25: Java Persistence API入門

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

Page 26: Java Persistence API入門

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 26

Page 27: Java Persistence API入門

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 27