beginning java ee 6 勉強会(1) #bje_study

44
Beginning Java EE 6 勉勉勉 (1) -Java EE 6 勉勉 - 担担担@making Toshiaki Maki 2012/04/18

Upload: toshiaki-maki

Post on 10-May-2015

9.799 views

Category:

Technology


14 download

TRANSCRIPT

Page 1: Beginning Java EE 6 勉強会(1) #bje_study

Beginning Java EE 6 勉強会 (1)-Java EE 6 概要 -

担当者: @makingToshiaki Maki

2012/04/18

Page 2: Beginning Java EE 6 勉強会(1) #bje_study

2

はじめに - Java EE 6 勉強会の進め方

• 隔週水曜日に各要素技術をそれぞれ扱います– 座学 + ハンズオン形式– 資料は業務外時間に作成し、原則 SlideShare に

アップします• 概要 4/18 @making• JPA 4/25 @kjstylepp• EJB 5/9 @inatus• JSF 5/23 @XXX• JMS 6/6 @XXX• JAX-WS 6/20 @masato_ka• JAX-RS 6/27 講師募集中

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 3: Beginning Java EE 6 勉強会(1) #bje_study

3

金魚本が手元にない方は

• いますぐぽちりましょう• http://amzn.to/JavaEE6

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 4: Beginning Java EE 6 勉強会(1) #bje_study

4

目次

12/04/18 Beginning JavaEE6 勉強会 (1)

1. Java EE 6 の概要

2. Java と永続化

Page 5: Beginning Java EE 6 勉強会(1) #bje_study

5

第 1 章Java EE 6 の概要

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 6: Beginning Java EE 6 勉強会(1) #bje_study

6

本論に入る前に質問

• 次のうち正しい組み合わせを全て選びなさい1. J2SE 1.4 – J2EE 1.42. J2SE 1.5 – J2EE 1.53. Java SE 1.5 – Java EE 54. Java SE 5 - Java EE 55. Java SE 1.6 – Java EE 66. Java SE 6 – Java EE 67. Java SE 7 – Java EE 6

12/04/18 Beginning JavaEE6 勉強会 (1)

ggrks

Page 7: Beginning Java EE 6 勉強会(1) #bje_study

7

Java EE 6 の概要

• 内部アーキテクチャ• Java EE 6 で新しくなった点

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 8: Beginning Java EE 6 勉強会(1) #bje_study

8

1.1 Java EE とは• Java Enterprise Edition • Java で ( 主に )Web アプリケーションを構築するための数々

の仕様、およびその実装です。– Servlet 、 JSP 、 EJB 、 JPA とか

• Java EE の仕様を満たした機能を提供するアプリケーションサーバを Java EE アプリケーションサーバと呼ぶ。– GlassFish(Oracle)– WebLogic Server(Oracle)– WebSphere Application Server(IBM)– JBoss Application Server (Redhat)– Cosminexus (Hitachi)– Interstage (Fujitsu)– WebOTX (NEC)– Geronimo (Apache)

• 同じアプリケーションならどのサーバでもが動く(はず、、)

• Tomcat はただのサーブレットコンテナです12/04/18 Beginning JavaEE6 勉強会 (1)

Page 9: Beginning Java EE 6 勉強会(1) #bje_study

9

1.1.1 Java EE 6 の歴史

12/04/18 Beginning JavaEE6 勉強会 (1)

Project JPE

J2EE 1.2

Servlet,JSP,EJB,JMS,RMI/IIOP

J2EE 1.3

EJB CMP,JCA

J2EE 1.4

Web Services,

Management,Deploym

ent

Java EE 5

Annotations,EJB3.0,JPA,JAX-WS,JSF

Java EE 6

Pruning,Profiles,EJB Lite,JAX-RS,CDI

Web Profile

ManagedBean

EnterpriseApplication

Rubustness

Web Services

Ease of Development

Flexible

May 1998 Dec 1999 Sep 2001 Nov 2003 May 2006 Dec 2009

Page 10: Beginning Java EE 6 勉強会(1) #bje_study

10

Java EE 6 の全体像

12/04/18 Beginning JavaEE6 勉強会 (1)

http://www.slideshare.net/takakiyo/jjuc-ccc-2010-spring より拝借

Page 11: Beginning Java EE 6 勉強会(1) #bje_study

11

ざっくり分類

• プレゼンテーション層→ JSF• トランザクション層→ EJB• データアクセス層→ JPA• DI 、コンポーネント管理→ CDI• メッセージング→ JMS• WEB サービス→ JAX-WS 、 JAX-RS

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 12: Beginning Java EE 6 勉強会(1) #bje_study

12

1.2 Java EE 6 の新しいキーワード

• さらなる開発容易性向上– 5 で大きく変わり、 EJB 、永続エンティ

ティ、 Web サービスがアノテーションベースに– 6 では JSF のマネージド Bean がアノテーション

ベースになり、 XML ディスクリプタも不要に– Servlet3.0 や CDI(Contexts and Dependency

Injection) 、 Bean Validation… 金魚本には載っていません

• 古い技術のプルーニング• 新しい仕様の追加

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 13: Beginning Java EE 6 勉強会(1) #bje_study

13

1.2.1 軽量化

• プルーニング– EJB 2.X CMP エンティティ Bean (JSR318)

• JPA へ– JAX-RPC (JSR101)

• JAX-WS へ– JAXR (JSR93)– Java EE アプリケーション・デプロイ (JSR88)

• プロフィル– Java EE のサブセット or スーパーセットの提供– Web プロファイル

• Servlet 3.0, JSP 2.2, EJB Lite 3.1, JPA 2.0, JSF 2.2 等

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 14: Beginning Java EE 6 勉強会(1) #bje_study

14

プロファイル

• Java EE のサブセットをプロファイルとして定義可能– Java EE コンテナが特定のプロファイルだけ実装し

てもよい– WAS8.5 ではより軽量な Liberty Profile を提供

12/04/18 Beginning JavaEE6 勉強会 (1)

Java EE Full Profile

Web Profile

Page 15: Beginning Java EE 6 勉強会(1) #bje_study

15

1.2.2 操作性の向上• JSF や Servlet の設定が簡単に• アノテーションの導入で XML ファイル (faces-

config.xml 、 web.xml) への設定がかなり省略可

12/04/18 Beginning JavaEE6 勉強会 (1)

import javax.ejb.EJB;import javax.faces.bean.ManagedBean; @ManagedBeanpublic class BookController { @EJB private BookEJB bookEJB;  private Book book = new Book(); private List<Book> bookList;  public String doCreateBook() { book = bookEJB.createBook(book); bookList = bookEJB.findBooks(); return "listBooks.xhtml"; }}

faces-config.xml の<managed-bean> タグ内に記述していた情報がアノテーションで表現可能に。(CDI を使うと @Named でOK)

Page 16: Beginning Java EE 6 勉強会(1) #bje_study

16

1.2.3 豊富な機能• JAX-RSでREST対応!• JPA2.0でデータベース操作がより柔軟に• EJB3.1でSingleton Session Bean(アプリで唯一のインスタンス )

12/04/18 Beginning JavaEE6 勉強会 (1)

import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import javax.persistence.Query;import javax.ws.rs.GET;import javax.ws.rs.Path;import javax.ws.rs.Produces; @Path("books")public class BookResource { @PersistenceContext private EntityManager em; @GET @Produces({"application/xml", "application/json"}) public List<Book> getAllBooks() { Query query = em.createNamedQuery("findAllBooks"); List<Book> books = query.getResultList(); return books; }}

Page 17: Beginning Java EE 6 勉強会(1) #bje_study

17

1.2.4 移植性の向上• JNDI 名が標準化され、どのコンテナでも同じアプ

リをデプロイできるようになった– これまではベンダ毎 (GlassFish 、 JBoss 、 WebLogic)

が独自に設定していたため、他製品へ移行する際にJNDI 名を変更する必要があった

• 組み込みコンテナが標準 API で用意され、 JavaSEで EJB の単体テストが簡単に行えるようになった– EJBContaioner container =

EJBContainer.createEJBContainer(p);– Hello hello = (Hello)

container.getContext().lookup(“java:global/classes/Hello”);

• 7 章で!

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 18: Beginning Java EE 6 勉強会(1) #bje_study

18

第 2 章Java と永続化

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 19: Beginning Java EE 6 勉強会(1) #bje_study

19

Java と永続化• データの永続化

– 通常はリレーショナルデータベースに永続化– リレーショナルデータベースと Java オブジェクト

• 主キー・外部キー・テーブル結合などオブジェクト指向言語とはまったく異なる表現

• Java オブジェクトの永続化の方法– シリアライゼーションによる永続化

• java.io.Serializable インタフェース• シンプルな機構であり、クエリ言語など機能が十分でない

– リレーショナルデータベースによる永続化• Java Database Connectivity(JDBC) によるアクセス• オブジェクト・リレーショナル・マッピング (ORM)

– Hibernate– TopLink– Java Data Objects(JDO)– ◎Java Persistence API(JPA)

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 20: Beginning Java EE 6 勉強会(1) #bje_study

20

2.1 JPA 仕様の概要

• JavaEE5 で JPA1.0 が登場• JPA は JDBC の上位の抽象層• javax.persistence パッケージ

• コンポーネント構成– ORM– エンティティマネージャ– Java Persistence Query Language– トランザクションとロック– コールバックとリスナ詳しくは 3-5 章で!

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 21: Beginning Java EE 6 勉強会(1) #bje_study

21

2.1.1 仕様の歴史• TopLink

– 1990年代初期からsmalltalk用に開発– Javaでも利用可能– しばらく標準化されず

• JDO– 市場に浸透せず

• 初期EJB– EJB1.0(1998)

• Entity Container Managed Persistence(CMP) という重量級コンポーネントモデル– EJB1.1

• J2EE1.2 の一部にEJB2.1• CMP強化

• Hibernate– 軽量のオブジェクト指向永続性モデル– オープンソースで成功

• JPA1.0– Hibernate の多くの設計原理を導入– EJB3.0(JSR220) の一部に– JavaEE5 に

• JPA2.0– JSR317– JavaEE6 に12/04/18 Beginning JavaEE6 勉強会 (1)

Page 22: Beginning Java EE 6 勉強会(1) #bje_study

22

2.1.2 JPA2.0 の新機能

• 単純データ型 (String,Integer など ) のコレクションと組み込み可能オブジェクトの個別テーブルマッピング

• Map型対応• 楽観的ロックに加え、悲観的ロックのサポート• Criteria API 導入• JPQL拡張 (case文など )• キャッシング API

など(詳しくは 3-5 章で!)

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 23: Beginning Java EE 6 勉強会(1) #bje_study

23

2.1.3 参照実装

• Eclipse Link 2.0– Oracle社から Eclipse Foundation寄贈された

Oracle TopLink を基盤として開発• その他の実装では– Hibernate– Toplink– OpenJPA– DataNucleus

• 以後、永続性プロバイダまたはプロバイダと呼ぶ

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 24: Beginning Java EE 6 勉強会(1) #bje_study

24

2.2 エンティティ

• オブジェクト エンティティ• オブジェクトはメモリ内にのみ存在する概念• エンティティはメモリ+データベース永続化

されるオブジェクト

• 具象型でも抽象型でも OK– 継承・リレーションシップのサポート

• JPQL に問い合わせ• データベースにアクセスしていることを意識

しない

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 25: Beginning Java EE 6 勉強会(1) #bje_study

25

2.2.1 オブジェクトリレーショナルマッピング

• 永続化プロバイダがエンティティを認識し、マッピングを解釈できるように次の 2つの形式で記述– アノテーション:エンティティのコードにアノ

テーション (javax.persistence パッケージ ) を記述

– XML ディスクリプタ:マッピングを外部 XML ファイルに定義

• Configuration by exception の考え方– デフォルトのマッピング規則 ( クラス名とテーブル

名は同じ、プロパティ名とカラム名は同じ、等 ) から外れる場合のみ設定すれば良い。

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 26: Beginning Java EE 6 勉強会(1) #bje_study

26

シンプルな Book エンティティ

12/04/18 Beginning JavaEE6 勉強会 (1)

@Entitypublic class Book { @Id @GeneratedValue private Long id; @Column(nullable = false) private String title; private Float price; @Column(length = 2000) private String description; private String isbn; private Integer nbOfPage; private Boolean illustrations; // 以下セッター・ゲッター略}

永続性プロバイダに認識させるためのアノテーション

主キーの指定

カラムの属性指定

Page 27: Beginning Java EE 6 勉強会(1) #bje_study

27

エンティティとテーブルのマッピング

12/04/18 Beginning JavaEE6 勉強会 (1)

<< エンティティ >>Book

-id: Long-title: String-price: Float-description: String-isbn: String-nbOfPage: Integer-illustrations: Boolean

Book

+ID bigint nullable=false

TITLE varchar(255) nullable=false

PRICE double nullable=true

DESCRIPTION varchar(2000) nullable=true

ISBN varchar(255) nullable=true

NBOFPAGE integer nullable=true

ILLUSTRATIONS smallint nullable=true

Page 28: Beginning Java EE 6 勉強会(1) #bje_study

28

2.2.2 エンティティのクエリ

• エンティティを操作する API が用意されている

• エンティティマネージャが中心に• CRUD 操作や JPQL による複雑なクエリ

• INSERT文や SELECT文を明示的に記述しなくても SQL が発行される

12/04/18 Beginning JavaEE6 勉強会 (1)

EntityManagerFactory emf = Persistence .createEntityManagerFactory("chapter02PU");EntityManager em = emf.createEntityManager();em.persist(book);

Page 29: Beginning Java EE 6 勉強会(1) #bje_study

29

エンティティマネージャによる操作

12/04/18 Beginning JavaEE6 勉強会 (1)

Book-id: Long-title: String-price: Float-description: String-isbn: String-nbOfPage: Integer-illustrations: Boolean

<< インタフェース >>EntityManager

+persist(entity: Object): void+find(entityClass: Class<T>, primaryKey: Object): <T>

Main

DB

Page 30: Beginning Java EE 6 勉強会(1) #bje_study

30

JPQL

• エンティティに対するクエリ言語• SQL に似ているが少し異なる

• 動的クエリ ( 実行時に生成 ) 、静的クエリ ( コンパイル時に決定 ) 、ネイティブクエリ (SQL)

• 静的クエリは名前付きで設定できる

• createNamedQuery でクエリ取得

12/04/18 Beginning JavaEE6 勉強会 (1)

“SELECT b FROM Book b WHERE b.title = ‘HOGE’"

@Entity@NamedQuery(name = "findAllBooks", query = "SELECT b FROM Book b")public class Book {

Query query = em.createNamedQuery(”findAllBooks");

Page 31: Beginning Java EE 6 勉強会(1) #bje_study

31

2.2.3 コールバックとリスナ

• エンティティは POJO– new した段階ではメモリ内に存在するだけで、エ

ンティティマネージャに認識されない– EntityManager#persist でエンティティを管理対象にし永続化する

– エンティティマネージャがエンティティを管理する場合は、エンティティに永続 ID を設定してデータベースと同期する

– エンティティマネージャから分離され、管理外になった場合は普通の Java オブジェクト

– EntityManager#remove を実行するとデータベースから削除され、管理対象外になるが、 GC が発生するまでメモリ内に残る

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 32: Beginning Java EE 6 勉強会(1) #bje_study

32

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

12/04/18 Beginning JavaEE6 勉強会 (1)

管理状態

メモリ内に存在

削除済み状態分離状態

データベース

new GC

persist

remove

refreshsetter

findJPQL

merge

cleardetach

Page 33: Beginning Java EE 6 勉強会(1) #bje_study

33

コールバックとリスナ

• エンティティで特定のライフサイクルイベントが発生したときの処理 ( コールバック ) を定義できる

• エンティティクラスに直接コールバックを記述できるし、リスナクラスに外出しすることも可能 (@EntityListeners)

• 5 章で!

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 34: Beginning Java EE 6 勉強会(1) #bje_study

34

コールバックアノテーション

12/04/18 Beginning JavaEE6 勉強会 (1)

管理状態

メモリ内に存在

削除済み状態分離状態

データベース

new GC

@PreLoad@PostLoad

@PreRemove

@PreUpdate@PostUpdate@PostLoad

@PostLoad

@PreUpdate@PostUpdate

@PostLoad

Page 35: Beginning Java EE 6 勉強会(1) #bje_study

35

ハンズオン演習

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 36: Beginning Java EE 6 勉強会(1) #bje_study

36

ハンズオン演習

• NetBeans と Derby を使用して JPA アプリケーションを作成– http://ja.netbeans.org/– 実行された SQL が分かりやすいように SQL ログが出力されるように設定されています• 参考 http://bit.ly/log4jdbc

• ハンズオンプロジェクト– https://www.dropbox.com/sh/1axggidrrjz3rnb/

OiMplS6LJW/beginning-javaee6

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 37: Beginning Java EE 6 勉強会(1) #bje_study

37

プロジェクトを開く

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 38: Beginning Java EE 6 勉強会(1) #bje_study

38

練習 1) エンティティクラスの作成

12/04/18 Beginning JavaEE6 勉強会 (1)

@Entity@NamedQuery(name = "findAllBooks", query = "SELECT b FROM Book b")public class Book { @Id @GeneratedValue private Long id; @Column(nullable = false) private String title; private Float price; @Column(length = 2000) private String description; private String isbn; private Integer nbOfPage; private Boolean illustrations; // 以下セッター・ゲッター略}

Page 39: Beginning Java EE 6 勉強会(1) #bje_study

39

練習 2) エンティティの生成

12/04/18 Beginning JavaEE6 勉強会 (1)

Book book = new Book();book.setTitle("The Hitchhiker's Guide to the Galaxy");book.setPrice(12.5F);book.setDescription("Science fiction comedy series created by Douglas Adams.");book.setIsbn("1-84023-742-2");book.setNbOfPage(354);book.setIllustrations(false);

Page 40: Beginning Java EE 6 勉強会(1) #bje_study

40

練習 3) エンティティの永続化

12/04/18 Beginning JavaEE6 勉強会 (1)

EntityManagerFactory emf = Persistence.createEntityManagerFactory("chapter02PU");EntityManager em = emf.createEntityManager(); 

Page 41: Beginning Java EE 6 勉強会(1) #bje_study

41

練習 4) エンティティの永続化

• persist メソッドで永続化します

12/04/18 Beginning JavaEE6 勉強会 (1)

EntityTransaction tx = em.getTransaction();tx.begin();em.persist(book);tx.commit();

em.close();emf.close();

Page 42: Beginning Java EE 6 勉強会(1) #bje_study

42

main メソッドを実行する前に

• Derby を起動する (接続情報は src/resources/META-INF/persistence.xml)

• 「ウィンドウ」→「サービス」→「データベース」→「 Java DB」→「データベースを作成」

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 43: Beginning Java EE 6 勉強会(1) #bje_study

43

実行

• main クラスで右クリック→「ファイルを実行」

• 「 java.sql.SQLException: Table/View ‘SEQUENCE’ は、既に Schema ‘APP’ に存在します。」なエラーログは無視

12/04/18 Beginning JavaEE6 勉強会 (1)

Page 44: Beginning Java EE 6 勉強会(1) #bje_study

44

演習• 演習1) 練習で永続化したオブジェクトを更新してください。• 演習2)演習1) で更新する前に flush() する場合、しない場

合とどう違うでしょうか。• 演習3) 演習1) のエンティティを削除してください。 (削除前に flush してください

• 演習4) エンティティを 100個登録してください。 SQL はどのタイミング発行されましたか。 (persist の後に printlnを入れてみてください )

• 演習5) “findAllBooks” の NamedQuery を実行し、結果をList で取得してください。

• 演習6) 管理済みエンティティを主キー (ID=1 など ) で一件のみ取得してください。ただし登録後には flush() してください。

• 演習7) 演習6) で flush後に clear() する場合、しない場合と比べてどう違うでしょうか。

12/04/18 Beginning JavaEE6 勉強会 (1)