Java EE 6 かんたんO/Rマッピング JPA2.0入門

28
<Insert Picture Here> 24WebLogic Server勉強会@東京 Java EE 6 かんたんO/Rマッピング JPA2.0入門」 日本オラクル株式会社 Fusion Middleware事業統括本部 ソリューション本部 シニアセールスコンサルタント 松林

description

Java EE 6のO/Rマッピング仕様であるJPAに関してご説明します。アプリケーションのデータアクセス層をかんたんに開発することができます。また、Oracle WebLogic Server 12cやOEPE 12cと連携した、JPA開発を解説いたします。 日本オラクル株式会社 Fusion Middleware事業統括本部 ソリューション本部 松林 晶

Transcript of Java EE 6 かんたんO/Rマッピング JPA2.0入門

Page 1: Java EE 6 かんたんO/Rマッピング JPA2.0入門

<Insert Picture Here>

第24回WebLogic Server勉強会@東京

「Java EE 6 かんたんO/Rマッピング JPA2.0入門」

日本オラクル株式会社 Fusion Middleware事業統括本部 ソリューション本部 シニアセールスコンサルタント 松林 晶

Page 2: Java EE 6 かんたんO/Rマッピング JPA2.0入門

Copyright© 2012, Oracle. All rights reserved. 2

以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。

OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。

Page 3: Java EE 6 かんたんO/Rマッピング JPA2.0入門

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)

Page 4: Java EE 6 かんたんO/Rマッピング JPA2.0入門

Copyright© 2012, Oracle. All rights reserved.

Java EE 6 かんたんO/Rマッピング JPA2.0入門

4

JPAとは

Page 5: Java EE 6 かんたんO/Rマッピング JPA2.0入門

Copyright© 2012, Oracle. All rights reserved.

Java EE 6 かんたんO/Rマッピング JPA2.0入門

JPAとは

5

• O/Rマッピングの仕様です • データベースのテーブルのレコードをJavaのオブジェクトに相互変換

• Javaのオブジェクトにアクセスし、データベース操作可能

Database

Java

Object

マッピング(自動で相互変換)

App

•参照

•挿入

•更新

•削除

Page 6: Java EE 6 かんたんO/Rマッピング JPA2.0入門

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.*)

Page 7: Java EE 6 かんたんO/Rマッピング JPA2.0入門

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

大量のコードを記述する必要あり

Page 8: Java EE 6 かんたんO/Rマッピング JPA2.0入門

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

Page 9: Java EE 6 かんたんO/Rマッピング JPA2.0入門

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

Page 10: Java EE 6 かんたんO/Rマッピング JPA2.0入門

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

決定 生成

Page 11: Java EE 6 かんたんO/Rマッピング JPA2.0入門

Copyright© 2012, Oracle. All rights reserved.

Java EE 6 かんたんO/Rマッピング JPA2.0入門

Persistence Unit

11

• persistence.xmlに記述

• データベースとの接続設定を記述

• エンティティクラスの指定

• トランザクションタイプの指定(RESOURCE_LOCAL/JTA)

• etc

Page 12: Java EE 6 かんたんO/Rマッピング JPA2.0入門

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

Page 13: Java EE 6 かんたんO/Rマッピング JPA2.0入門

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

Page 14: Java EE 6 かんたんO/Rマッピング JPA2.0入門

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

Page 15: Java EE 6 かんたんO/Rマッピング JPA2.0入門

Copyright© 2012, Oracle. All rights reserved.

Java EE 6 かんたんO/Rマッピング JPA2.0入門

エンティティのライフサイクル

15

Page 16: Java EE 6 かんたんO/Rマッピング JPA2.0入門

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

Page 17: Java EE 6 かんたんO/Rマッピング JPA2.0入門

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表

エンティティクラス

Page 18: Java EE 6 かんたんO/Rマッピング JPA2.0入門

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; //セッタ・ゲッタ }

エンティティクラス

Page 19: Java EE 6 かんたんO/Rマッピング JPA2.0入門

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

Page 20: Java EE 6 かんたんO/Rマッピング JPA2.0入門

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'

Page 21: Java EE 6 かんたんO/Rマッピング JPA2.0入門

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

Page 22: Java EE 6 かんたんO/Rマッピング JPA2.0入門

Copyright© 2012, Oracle. All rights reserved.

Java EE 6 かんたんO/Rマッピング JPA2.0入門

22

JPA2.0新機能

Page 23: Java EE 6 かんたんO/Rマッピング 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から削除

Page 24: Java EE 6 かんたんO/Rマッピング JPA2.0入門

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

Page 25: Java EE 6 かんたんO/Rマッピング JPA2.0入門

Copyright© 2012, Oracle. All rights reserved.

Java EE 6 かんたんO/Rマッピング JPA2.0入門

25

JPAかんたん開発DEMO (with Oracle Enterprise Pack for Eclipse)

Page 26: Java EE 6 かんたんO/Rマッピング JPA2.0入門

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

自動生成

Page 27: Java EE 6 かんたんO/Rマッピング JPA2.0入門

Copyright© 2012, Oracle. All rights reserved.

Page 28: Java EE 6 かんたんO/Rマッピング JPA2.0入門

Copyright© 2012, Oracle. All rights reserved. 28