50
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | JPA 入門 はじめてのJava EEアプリケーション開発シリーズ 4: 日本オラクル株式会社 オラクルユニバーシティ 岡田 大輔 201410291

JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Embed Size (px)

DESCRIPTION

JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回 JPA (Java Persistence API)はJavaアプリケーションのデータベースアクセスをシンプルに、効率良く実装するためのO/Rマッピングの仕様です。JPAの特長、O/Rマッピング、EJBからの JPAの利用方法などを解説します。 日本オラクル株式会社  オラクルユニバーシティ 岡田 大輔

Citation preview

Page 1: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

JPA 入門 はじめてのJava EEアプリケーション開発シリーズ 第4回:

日本オラクル株式会社 オラクルユニバーシティ 岡田 大輔 2014年10月29日

1

Page 2: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

Safe Harbor Statement

The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.

2

Page 3: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

Java Platform, Enterprise Edition おさらい

• Java SE をベースにした企業システム向けのフレームワーク

–オープンなWebシステムの構築を支える機能群の標準仕様 • コミュニティ主導のエンタープライズ・ソフトウェア標準

• コンポーネント仕様とサービスアクセスのための各種APIを規定

–移植性(Write Once Run Anywhere を担保)

– Oracle などのベンダーは、Java EE に準拠した実装としてアプリケーション・サーバーを提供 • Oracle WebLogic Server

• GlassFish

3

Page 4: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

Java EE 6 の主な標準仕様 おさらい

標準仕様 開発領域 特徴

JSF 2.1

Webアプリケーション

• リッチなユーザインタフェースの効率的な開発を実現するWebアプリケーション・フレームワーク

Servlet 3.0 • 冗長な設定・コード記述の削減により開発生産性を向上 • 非同期ServletによるAjax対応

EJB 3.1 ビジネスロジック • 冗長な設定・コード記述の削減により開発生産性を向上 • より柔軟な制御機能の追加

JPA 2.0 永続化ロジック • ORマッピングフレームワーク

JAX-RS Webサービス • 容易なサービス公開を実現するWebサービス標準仕様

CDI 全領域 • レイヤ間の疎結合化による柔軟性を向上するDIフレームワーク標準仕様

4

Page 5: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

WebLogic Server

Webアプリケーション

プレゼンテーション

ビジネス・ロジック

永続化ロジック

これから作成するアプリケーション

Product Integer id; String productName; Integer price; Integer units;

開発環境

開発・ デプロイ

ProductEJB List<Product> getAllProducts() { } void create(Product entity); void remove(Product entity); void edit(Product entity);

@Named ProductController List<Product> list; String search() { } String create() { } String delete() { } String update() { }

ProductBean List<Product> list; String search() { } String create() { } String delete() { } String update() { }

search.xhtml 検索

list.xhtml 一覧

index.xhtml メニュー

create.xhtml 作成

update.xhtml 更新

delete.xhtml 削除

第2回で説明しました 第3回で説明しました

第4回(今回)説明します

5

Page 6: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

今回作成するアプリケーション

index.xhtml (メニュー)

<p>商品管理</p>

<h:form> 商品の表示 <h:commandButton value="表示"

action="#{productBean.toList}" /> </h:form> ProductBean

@Inject ProductEJB productEJB; public List<Product> getList() { return productEJB.findAll(); } public String toList() { return "list"; } public String toIndex() { return "index"; }

list.xhtml (一覧)

<p><h:outputText value="商品一覧: " /></p>

<h:dataTable value="#{productBean.list}" var="c” border="1"> <h:column> <f:facet name="header"> <h:outputText value="商品番号" />

</f:facet> <h:outputText value="#{c.id}" /> </h:column> </h:dataTable> <h:form> <h:commandButton value="戻る”

action="#{productBean.toIndex}" /> </h:form>

Product

@Entity Public class Product { @Id private Integer id; private Date creationDate; private String description; private Date modificationDate; private Integer price;

ProductEJB @PersistentContext EntityManager em; private List<Product> findAll() { return em.createNamedQuery ("Product.findAll") .getResultList(); }

JPA エンティティ

6

Page 7: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

JPA(Java Persistence API)とは?

7

Page 8: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

JPA (Java Persistence API)とは?

• JPA 2.0は Java EE 6 で使用可能な標準ORマッピング・フレームワーク

– ORマッピング … JavaのオブジェクトとRDBのデータをマッピングするしくみ

– Java SE 環境でも Java EE 環境でも使用可能 • アプリケーション管理の永続性(Java SE / Java EE)

• コンテナ管理の永続性 (Java EE)

8

データベース Java

オブジェクト

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

アプリケーション

参照 挿入 更新 削除

Page 9: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

public static void main(String[] args) { EntityManager em = Persistence.createEntityManagerFactory("db") .createEntityManager(); Employee emp = em.find(Employee.class, 100); System.out.println(emp); em.close(); }

JDBCとJPA(ORマッピング)

9

public static void main(String[] args) { try (Connection con = DriverManager.getConnection ( "jdbc:oracle:thin:@localhost:1521:xe", "HR", "hr"); Statement 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 (SQLException e) { e.printStackTrace(); } }

JDBC (Java SE 7 try-with-resources) を使ったデータベースアクセス JPAを使ったデータベースアクセス

JPAでは、エンティティとRDBとのデータ変換をEntityManager APIで行うため、エンティティからDBアクセスロジックが切り離される (大幅なコード削減)

Page 10: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

JPAの構成要素

Persistence Context

EntityManager

Persistent Unit

(persistence.xml)

EntityManagerFactory

Entity

Entity

Entity

Entity

Entity

データベース 決定 生成

Persistence Unitの設定に基づいて EntityManagerのインスタンスを生成するファクトリクラス

エンティティの操作(CRUD)を行うためのAPIを提供

10

データソースやEntityManagerのトランザクション・タイプなどを指定

Page 11: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

永続性ユニット

• persistence.xml によって定義される永続化のための構成情報

–永続性ユニットの名前、トンランザクション・タイプ

–永続性プロバイダ

–データベース接続設定 (Java EEアプリケーションの場合はデータソース名)

–永続性ユニットが管理するエンティティクラス

11

TIPS: 永続性ユニットのトランザクション・タイプ(transaction-type) EntityManagerがJTAトランザクションを使用するか、リソース・ローカル・トランザクションを使用するかを指定 (Java EE環境ではJTAがデフォルト、Java SE環境ではRESOURCE_LOCALがデフォルト)

Page 12: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

persistence.xml : 例

12

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="2.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_2_0.xsd">

<persistence-unit name="prodMgmtPU" transaction-type="JTA">

<jta-data-source>jdbc/default</jta-data-source>

<exclude-unlisted-classes>false</exclude-unlisted-classes>

<properties/>

</persistence-unit>

</persistence>

Java EE アプリケーションではtransaction-typeはJTAを指定

データベースに接続するためのデータソースのJNDI名を指定 (データソースはWebLogic Serverで設定する)

Page 13: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

WebLogic Server

データソース

おさらい: アプリケーションのデータベース接続 データソース(接続プール)を利用

JNDI

デプロイ時にバインド

デプロイ時に 初期容量まで接続

JPA アプリケーション

接続オブジェクト 取得

JNDIルックアップ

Entity オブジェクト

persistence.xml

<jta-data-source />

EntityManager

PersistenceContext

接続プール

TIPS:

アプリケーション・サーバーが提供するデータベース接続サービス(データソース)を利用

13

Page 14: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

おさらい: データソースの設定 (1)

14

データソースのJNDI名は任意の文字列を指定できます

非XAドライバ(Type 4)を選択しておくとNetBeansでの追加設定を省けます

Page 15: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

おさらい: データソースの設定 (2)

15

トランザクション・オプションはデフォルト設定のままでOKです

次のページで作成指定する場合はデータベース名: は任意で指定できます

Page 16: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

おさらい: データソースの設定 (3)

16

JDBC URLで指定したデータベースを作成する場合は、プロパティ: に 「create=true」を追記します

Page 17: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

おさらい: データソースの設定 (4) と確認

17

JDBCデータ・ソースの対象を指定します

データ・ソースがデプロイされていると[モニタリング]-[統計]タブにインスタンスの行が表示されます

Page 18: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

エンティティ・クラス

• 永続化されるデータをあらわすクラス

– EntityManagerによって管理される

– POJO(Plain Old Java Object)として実装される • クラスには @Entity 注釈を指定

• 永続ストアのキー(主キー)に関連付けられた一意のIDを持つ(@Id注釈)

• エンティティの要素(POJOのフィールド)へのアクセサ・メソッド

– JPQLなどを使って問い合わせ可能

18

Page 19: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

エンティティとデータベースの関係

ID (PK) PRODUCTCODE PRODUCTNAME PRICE CREATION_DATE

1 P0001 商品01 200 2014-10-29

2 P0002 商品02 50 2014-10-29

3 P0003 商品03 500 2014-10-29

4 P0004 商品04 150 2014-10-29

Product

private Integer Id private String productCode private String productName Private Integer price private Date creationDate

public Product () public getXXX() public setXXX()

PRODUCTS

ID INTEGER [PK] PRODUCTCODE VARCHAR(10) [NOT NULL] PRODUCTNAME VARCHAR(40) PRICE INTEGER CREATIONDATE DATE

<<Product>> id: 1

<<Product>> id: 3

クラスと表

インスタンスと列

19

Page 20: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

エンティティ・クラスの構造

20

Product.java import javax.persistence.Entity;

import javax.persistence.Id;

import javax.persistence.Temporal;

import javax.persistence.TemporalType;

@Entity

public class Product implements Serializable {

@Id private Integer id;

private String productCode;

private String productName;

private Integer price;

@Temporal(TemporalType.TIMESTAMP) private Date creationDate;

public Product() {

}

// …

エンティティ・クラス名は 表名と同じ

主キー

フィールド名は 表の列名と同じ

時刻(日付)型のマッピング

Javax.persistence.* パッケージをインポート

引数なしのコンストラクタ

Page 21: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

データベースからのエンティティ・クラスの作成 (1) 既存のデータベース表からエンティティを定義する場合は、[新規ファイル] – [持続性] – [データベースからのエンティティ・クラス]を選択します

エンティティ・クラスは[新規ファイル] – [持続性] – [エンティティ・クラス]を選択して作成することもできます

21

Page 22: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

データベース表からのエンティティの作成 (2)

22

スキーマを指定します

マッピングする表を選択します

Page 23: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

データベース表からのエンティティの作成 (3)

23

クラス名やパッケージを必要に応じて指定します

Page 24: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

エンティティ・クラスのあれこれ (1) 主キー

• すべてのエンティティは主キーを持つ必要がある

–エンティティ・インスタンスを一意に識別するフィールド • @Id注釈で指定

• 主キーは生成計画を指定して自動生成も可能

– GenerationType.AUTO

– GenerationType.IDENTITY … DBのID列を指定

– GenerationType.SEQUENCE … DBの順序を指定

– GenerationType.TABLE … ID生成用の表を指定

24

Product.java

@Id @SequenceGenerator(name = "prodSeq", sequenceName = "PROD_SEQ", allocationSize = 50) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "prodSeq") private Integer id;

Page 25: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

エンティティ・クラスのあれこれ (2) マッピングのオーバーライド

• エンティティ・クラスとフィールドはデータベースの表と列にマッピングされる

–エンティティの名前とデータベースでの名前が同じであるとみなされる(デフォルト・マッピング)

–名前が異なる場合は、注釈を使用してマッピングをオーバーライド可能

25

クラス名と表名のマッピングは@Table注釈で指定します

フィールド名と列名のマッピングは@Column注釈で指定します

Product.java @Entity @Table(name = "EMP") public class Employee { @Column (name = "EMP_NAME") private String employeeName; // … }

Page 26: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

エンティティ・クラスのあれこれ (3) 時刻をもつフィールド

• エンティティで時刻(java.util.Dateやjava.util.Calndar )を持つフィールドを扱う場合は、@Temporal注釈でデータベース型を指定する – TemporalType.DATE … java.sql.Date

– TemporalType.TIME … java.sql.Time

– TemporalType.TIMESTAMP … java.sql.TimeStamp

26

creationDateは java.sql.TimeStamp型として永続化される

Product.java

@NotNull @Column(name = "CREATION_DATE") @Temporal(TemporalType.TIMESTAMP) private Date creationDate;

Page 27: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

エンティティ・クラスのあれこれ (4) 一時フィールド

• デフォルトではエンティティ・クラスのフィールドは永続化される

–永続化対象から除外する場合は、@Transient注釈を指定する

27

crrentTotalは永続化されない

Cart.java

@Entity public class Cart implements Serializable { @Id private int customerId; @Transient private double currentTotal; // …

Page 28: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

• Java EE 環境では、EntityManagerは JTAトランザクションを利用する

– Bean管理トランザクション(BMT) … Servlet, CDI Bean

–コンテナ管理トランザクション(CMT) … EJB

Java EE 環境でのJPAの操作とトランザクション

28

@Entity public class Product implements Serializable { @Id private Integer id; // … }

永続化ロジック

@Stateless public class ProductEJB { @PersistenceContext private EntityManager em; // … }

ビジネスロジック Servlet

プレゼンテーション

JSF ManagedBean

Webサービス エンドポイント

EJB JPA

トランザクション境界

Page 29: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

EntityManagerの取得

• Java EE – EntityManagerはDI(依存性注入)可能 (@PersistenceContext注釈)

• Java SE – EntityManagerFactoryを使ってインスタンス化

29

EntityManagerFactory emf = Persitence.createEntityManagerFactory("prodMgmtPU"); EntityManager em = emf.createEntityManager();

persitence.xml で定義した永続性ユニットを指定します ・transation-typeはRESOURCE_LOCAL ・JDBCドライバ情報を <property> 要素に指定

ProductEJB.java @PersitenceContext EntityManager em;

Page 30: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

PersistenceContext

管理対象

Managed

デタッチ

Detached

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

削除済み

Removed New

new

em.find

em.persist em.remove

em.clear em.detatch

em.merge

em.refresh

em.flush

永続IDが関連付けられたオブジェクト

存在しない

TXコミット時に永続ストアから削除される

30

Page 31: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

エンティティの操作 (1) – 永続化 EntityManagerのメソッド

• データベースにエンティティを永続化する(SQLのINSERT文に相当)

– persist後のエンティティはPersistenceContext に関連付けられた状態(管理対象)

31

ProductEJB.java

public void create(Product entity) { em.persist(entity); }

Page 32: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

エンティティの操作 (2) – 検索 EntityManagerのメソッド

• 主キーに基づいてエンティティを検索する(SQLのSELECT文に相当)

–メソッド戻り値は、PersistenceContextに関連付けられた状態(管理対象)

– findメソッドの引数 • 第1引数 … エンティティ・クラス

• 第2引数 … 主キー (基本データ型はオートボクシングされる)

32

ProductEJB.java

public Product find(Integer custId) { return em.find(Product.class, custId); }

Page 33: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

エンティティの操作 (3) – 更新 EntityManagerのメソッド

• 管理対象エンティティを更新すると変更が永続ストアに反映される (SQLのUPDATE文に相当)

–管理対象ではない(デタッチ状態)エンティティを更新する場合は、mergeメソッドで管理対象エンティティを取得する

33

ProductEJB.java

Product prod = em.find(Product.class, 2); prod.setUnits(5);

prod.setStatus("N");

管理対象エンティティを取得

TX コミット時に変更がデータベースに反映される

public void edit(Product entity) { em.merge(entity); };

デタッチ状態のエンティティが引数として渡される

Page 34: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

• 管理対象エンティティを削除すると変更が永続ストアに反映される (SQLのDELETE文に相当)

–エンティティを管理対象にしてから削除を行う

エンティティの操作 (4) – 削除 EntityManagerのメソッド

34

ProductEJB.java

public void remove(Product entity) { em.remove(em.merge(entity)); }

TXがコミットされると削除が永続ストアに反映される。 コミット時点ではJavaオブジェクトそのものは削除されない

Page 35: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

エンティティの問い合わせ

• JPQL(Java Persistence Query Language ) –エンティティに対する問い合わせ言語

• SQLによく似た構文

• SELECT / UPDATE / DELETE に対応

• WHERE句(フィルタ) / ORDR BY(ソート) / GROUP BY (集約) も可能

35

SELECT p FROM Product p

エンティティ・クラス名

識別変数(エイリアス)

Page 36: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

基本的な JPQL

• エンティティのフィールドを返すJPQL

• WHERE 句 と ORDER BY

– 比較、BETWEEN、LIKE、INなどSQLで使用できる演算子はJPQLでも使用可能

– 文字列関数や算術関数も使用可能

• CONCAT, SUBSTRING, TRIM, LOWER, UPPER, LOCATE, LENGTH, ABS, SQRT, MOD, SIZE など

36

SELECT p.productName FROM Product p

SELECT p FROM Product p WHERE p.productName LIKE '%01' ORDER BY p.id

Page 37: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

問い合わせの作成 (1) 動的問い合わせ

• 動的問い合わせ (Query / TypedQuery)

– JPQLでは名前付きパラメータを使用可能

37

String queryString = "SELECT p FROM Product p WHERE p.price > 50 ORDER BY p.id"; Query query = em.createQuery(queryString); Product product = (Product) query.getSingleResult();

TypedQuery<Product> typedQuery = em.createQuery(queryString, Product.class); Product product = typedQuery.getSingleResult();

Qrueyの戻り値はObjectなので必要に応じてキャストを行います

TypedQueryは作成時に型指定を行います

String queryString = "SELECT p FROM Product p WHERE p.price > :price ORDER BY p.id”; TypedQuery<Product> typedQuery = em.createQuery(queryString, Product.class); typedQuery.setParameter("price", 50); List<Product> list = typedQuery.getResultList();

名前付きパラメータの代わりに 位置パラメータ (?1) も使用できます

Page 38: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

問い合わせの作成 (2) 名前付き問い合わせ

• 名前付き問い合わせ

–エンティティ・クラスで@NamedQuery属性を使用して問い合わせを宣言

38

Product.java

@Entity @Table(name = "PRODUCTS") @NamedQueries({ @NamedQuery(name = "Product.findAll", query = "SELECT p FROM Product p ORDER BY p.id"), @NamedQuery(name = "Product.findByProductName", query = "SELECT p FROM Product p WHERE p.productName LIKE :productName ORDER BY p.id")}) public class Product implements Serializable { // …

@NamedQuery注釈が複数ある場合は@NamedQueries注釈を使用します

public List<Product> findAll() { return em.createNamedQuery("Product.findAll").getResultList(); }

@NamedQueryのname属性を指定します

ProductEJB.java

Page 39: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

問い合わせの実行

• 問い合わせの結果を返すメソッド (Query / TypedQuery )

– getResultList() … 問い合わせ結果のListを返す (TypeQueryは型付けされたListを返す)

– getSingleResult() … 単一の問い合わせ結果を返す (TypedQueryは型付けされた結果を返す)

• 結果が複数ある場合は NonUniqueResultException がスローされる

• 結果がない場合は NoResultException がスローされる

39

TIPS: どちらのメソッドでも UPDATE / DELETE 文を実行すると IllegalStateException をスローします UPDATE / DELETE 文を実行するには executeUpdate() を使用します

Page 40: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

問い合わせの作成 (3) NativeQuery と Criteria API

• NativeQuery … 問い合わせをSQLで記述

–動的問い合わせは Queryインタフェースのみ使用可能

–エンティティ・クラスでは@NamedNativeQuery注釈で宣言可能

• Criteria API … 型指定された問い合わせをAPIベースで記述

40

CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Product> cq = cb.createQuery(Product.class); Root<Product> product = cq.from(Product.class); cq.select(product); TypedQuery<Product> query = em.createQuery(cq); List<Product> list = query.getResultList();

等価なJPQL: SELECT p FROM Product p

Page 41: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

まとめ

• JPAは、Java EE の標準ORマッピング・フレームワークです

– JavaオブジェクトをRDBの永続データに相互変換 • @Entityなどの注釈を使用したかんたん開発

–エンティティの操作はEntityManagerを使用します • CRUD操作はEntityManagerのメソッドで(create, find, merge, remove など)

–トランザクション制御が必要な場合はコンテナ管理トランザクション(EJB)が便利

• 問い合わせはJPQL、NativeSQL、Criteria APIで

– WebLogic Serverにデータソースの設定を行いましょう • 永続ユニットで指定したJNDI名を設定する

• 本番環境ではチューニングも忘れずに

41

Page 42: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

オラクルユニバーシティからのお知らせ

42

Page 43: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

オラクルユニバーシティからのお知らせ

• WebLogic Serverの管理方法やJava EE 6を使ったアプリケーション開発方法を体系的に学習したい方に最適な研修コースをご提供しています。

– Classroomトレーニングだけでなく、Live Virtual Classや『Oracle トレーニング・オンデマンド』など多様な受講形態から選択いただけます。

43

Page 44: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

コース内容

■Oracle WebLogic Server概要

■ドメインの作成

■Administration Console

■ドメインのモニタリング ■アプリケーションのデプロイメント

■WebLogic Server セキュリティ ■ドメインのバックアップおよびリカバリ

■WebLogic Serverのインストールおよびパッチ適用

■サーバーの起動および停止

■JDBCデータソースの構成

■ノードマネージャ ■WebLogic Serverクラスタリング

■トランザクション・サービスのコンフィグレーション

受講前提条件 ・Linux の基本的な操作方法の理解 ・Java EE の基礎知識(サーブレットや JSP など) ※推奨

対象者 ・Oracle WebLogic Server 管理者

・Javaアプリケーション開発者

・アーキテクト

コース日程 5日間 日程の詳細は Oracle University Webサイト にてご確認ください。

受講料 定価¥374,850(税込) ※Oracle PartnerNetwork会員様は、パートナー割引価格で受講いただけます。

Oracle WebLogic Server 12c の運用管理スキルをしっかり習得 待望のWebLogic Server 12c(12.1.2)対応研修は絶賛提供中です。

このコースでは、アプリケーション・サーバー管理者がOracle WebLogic Server 12cのインストールおよび設定方法を習得することができま

す。管理コンソールやコマンドラインツール(WLST)などを使用してドメインを構成する方法やJava EEアプリケーションをサーバーにデ

プロイする方法についても説明します。さらに、Oracle WebLogic Server のプロキシとしてOracle HTTP Serverを設定し、WebLogic Serverク

ラスタによるアプリケーションのフェイルオーバーとロードバランシングをサポートする方法など、環境構築に必要なスキルとWebLogic

Serverのモニタリングやログ情報の収集など運用に必要なスキルを実機演習を通して習得できます。さらに、Oracle WebLogic Server 12cで

強化されたActive GridLink for RACの構成方法やWebLogic Server 12.1.2の新機能である動的クラスタなど注目の新機能もカバーします。

Oracle WebLogic Server 12c: 管理 I ミドルウェア

開催日程 ■ 2014年 11月 17日 (月) 〜 21日 (金)

44

Page 45: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

コース内容

■Java EE 6 概要

■開発環境の整備

■Webコンポーネントモデル

■JSFを使用した開発 ■CDIによる依存性注入

■JSF モバイルアプリケーションの作成

■Bean Validationの使用

■EJBコンポーネントモデル

■Java Persistence API

■トランザクションポリシーの実装 ■セキュリティポリシーの実装

■WebサービスおよびJava EE 統合技術

受講前提条件 ・SQLおよびHTML, CSSの基礎知識 ・統合開発環境(IDE)を使用したJavaプログラミング経験

対象者 ・Javaアプリケーション開発者

・システム・エンジニア

・アーキテクト

コース日程 5日間 日程の詳細は Oracle University Webサイト にてご確認ください。

受講料 定価¥374,850(税込) ※Oracle PartnerNetwork会員様は、パートナー割引価格で受講いただけます。

開発生産性がさらに向上したJava EE 6 標準技術で作る Webアプリケーションの開発ポイントが分かる。開発者にオススメのコース

このコースでは、Java EE 6 に準拠したWebアプリケーションを開発、およびデプロイするための知識を習得することができます。

JavaServer Faces、Enterprise Java Beans、Java Persistence API をはじめとしたJava EE 6の主要な標準仕様について理解し、主にJSFテクノ

ロジーを使用した、デスクトップやモバイルWebブラウザからアクセス可能なエンドツーエンドのWebアプリケーションの開発方法

を豊富な演習を通して学習することができます。

Java EE 6 アプリケーション開発

開催日程 ■ 2014年 11月 10日 (月) 〜 14日 (金)

Java

45

Page 46: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

コース内容

JVMおよびパフォーマンスの概要

Javaガベージ・コレクションの仕組み

Java ガベージ・コレクタ

コマンドラインからのJVMの監視 Mission Control および JVM 監視ツール

Java Flight Recorder

OSレベルでのパフォーマンスの監視

パフォーマンス・プロファイリング・ツール

プロファイリングを使用したパフォーマンス問題のトラブルシュート

ガベージ・コレクションのチューニング 言語レベルでの考慮事項とガベージ・コレクション

受講前提条件 ・Java SE 7 プログラミング I / II 受講相当の知識

対象者 ・Javaアプリケーション開発者

・システム・エンジニア

・アーキテクト

・サポートエンジニア

コース日程 3日間 日程の詳細は Oracle University Webサイト にてご確認ください。

受講料 定価¥289,008(税込) ※Oracle PartnerNetwork会員様は、パートナー割引価格で受講いただけます。

ガベージコレクションの仕組みからツールの活用方法まで Javaパフォーマンス・チューニングのエッセンスを身につけよう

このコースでは、Javaプログラミング言語に適用可能なパフォーマンス・チューニングの手法を学習します。また、G1GCを含む

Hotspot JVMにおけるJavaガベージ・コレクションの仕組みとパフォーマンスへの影響を理解するとともに、Java Mission Controlや

Flight Recorderなどのツールの使用したパフォーマンス問題の解決方法を学習します。 • パフォーマンスに関する基本原則の理解

• Java SE 7 で使用できるガーベージ・コレクタの理解と適切な選択 • 各種ツールを活用したパフォーマンス・チューニングの実践

Java SE 7 パフォーマンス・チューニング

開催日程 ■ 2014年 11月 26日 (水) 〜 28日 (金)

Java

46

Page 47: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

『秋のスキルアップキャンペーン』のご案内 11月に研修を受講された方に Dukeぬいぐるみ プレゼント!

• 11月にトレーニングキャンパス赤坂、またはLive Virtual Classで開催されるMiddleware/Java 研修コースを受講された方にもれなくDukeぬいぐるみをプレゼントします。 研修受講を検討されている方はこの機会に是非!

47

お問い合せは オラクルユニバーシティ まで

http://www.oracle.com/jp/education/ Tel: 0120-155-092

トレーニングキャンパス赤坂で開催される研修コース 日程

Java SE 7 プログラミング I 2014/11/19 - 11/21

Java SE 7 プログラミング II 2014/11/25 - 11/27

Java EE 6: JSF を使ったWebアプリケーション開発 2014/11/18 - 11/21

Oracle WebLogic Server 12c: 管理 I 2014/11/17 - 11/21

Java SE 7 パフォーマンス・チューニング 2014/11/26 - 11/28

Page 48: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |

『秋のスキルアップキャンペーン』のご案内 11月に研修を受講された方に Dukeぬいぐるみ プレゼント!

• 11月にトレーニングキャンパス赤坂、またはLive Virtual Classで開催されるMiddleware/Java 研修コースを受講された方にもれなくDukeぬいぐるみをプレゼントします。 研修受講を検討されている方はこの機会に是非!

48

お問い合せは オラクルユニバーシティ まで

http://www.oracle.com/jp/education/ Tel: 0120-155-092

Live Virtual Classで開催される研修コース 日程

Java SE 8 新機能 2014/11/27 - 11/28

Java EE 7: 新機能 2014/11/25 - 11/26

Page 49: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回

Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | 49

Page 50: JPA入門: はじめてのJava EEアプリケーション開発シリーズ: 第4回