Download - Beginning Java EE 6 勉強会(1) #bje_study
Beginning Java EE 6 勉強会 (1)-Java EE 6 概要 -
担当者: @makingToshiaki Maki
2012/04/18
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)
3
金魚本が手元にない方は
• いますぐぽちりましょう• http://amzn.to/JavaEE6
12/04/18 Beginning JavaEE6 勉強会 (1)
4
目次
12/04/18 Beginning JavaEE6 勉強会 (1)
1. Java EE 6 の概要
2. Java と永続化
5
第 1 章Java EE 6 の概要
12/04/18 Beginning JavaEE6 勉強会 (1)
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
7
Java EE 6 の概要
• 内部アーキテクチャ• Java EE 6 で新しくなった点
12/04/18 Beginning JavaEE6 勉強会 (1)
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)
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
10
Java EE 6 の全体像
12/04/18 Beginning JavaEE6 勉強会 (1)
http://www.slideshare.net/takakiyo/jjuc-ccc-2010-spring より拝借
11
ざっくり分類
• プレゼンテーション層→ JSF• トランザクション層→ EJB• データアクセス層→ JPA• DI 、コンポーネント管理→ CDI• メッセージング→ JMS• WEB サービス→ JAX-WS 、 JAX-RS
12/04/18 Beginning JavaEE6 勉強会 (1)
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)
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)
14
プロファイル
• Java EE のサブセットをプロファイルとして定義可能– Java EE コンテナが特定のプロファイルだけ実装し
てもよい– WAS8.5 ではより軽量な Liberty Profile を提供
12/04/18 Beginning JavaEE6 勉強会 (1)
Java EE Full Profile
Web Profile
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)
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; }}
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)
18
第 2 章Java と永続化
12/04/18 Beginning JavaEE6 勉強会 (1)
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)
20
2.1 JPA 仕様の概要
• JavaEE5 で JPA1.0 が登場• JPA は JDBC の上位の抽象層• javax.persistence パッケージ
• コンポーネント構成– ORM– エンティティマネージャ– Java Persistence Query Language– トランザクションとロック– コールバックとリスナ詳しくは 3-5 章で!
12/04/18 Beginning JavaEE6 勉強会 (1)
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)
22
2.1.2 JPA2.0 の新機能
• 単純データ型 (String,Integer など ) のコレクションと組み込み可能オブジェクトの個別テーブルマッピング
• Map型対応• 楽観的ロックに加え、悲観的ロックのサポート• Criteria API 導入• JPQL拡張 (case文など )• キャッシング API
など(詳しくは 3-5 章で!)
12/04/18 Beginning JavaEE6 勉強会 (1)
23
2.1.3 参照実装
• Eclipse Link 2.0– Oracle社から Eclipse Foundation寄贈された
Oracle TopLink を基盤として開発• その他の実装では– Hibernate– Toplink– OpenJPA– DataNucleus
• 以後、永続性プロバイダまたはプロバイダと呼ぶ
12/04/18 Beginning JavaEE6 勉強会 (1)
24
2.2 エンティティ
• オブジェクト エンティティ• オブジェクトはメモリ内にのみ存在する概念• エンティティはメモリ+データベース永続化
されるオブジェクト
• 具象型でも抽象型でも OK– 継承・リレーションシップのサポート
• JPQL に問い合わせ• データベースにアクセスしていることを意識
しない
12/04/18 Beginning JavaEE6 勉強会 (1)
25
2.2.1 オブジェクトリレーショナルマッピング
• 永続化プロバイダがエンティティを認識し、マッピングを解釈できるように次の 2つの形式で記述– アノテーション:エンティティのコードにアノ
テーション (javax.persistence パッケージ ) を記述
– XML ディスクリプタ:マッピングを外部 XML ファイルに定義
• Configuration by exception の考え方– デフォルトのマッピング規則 ( クラス名とテーブル
名は同じ、プロパティ名とカラム名は同じ、等 ) から外れる場合のみ設定すれば良い。
12/04/18 Beginning JavaEE6 勉強会 (1)
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; // 以下セッター・ゲッター略}
永続性プロバイダに認識させるためのアノテーション
主キーの指定
カラムの属性指定
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
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);
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
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");
31
2.2.3 コールバックとリスナ
• エンティティは POJO– new した段階ではメモリ内に存在するだけで、エ
ンティティマネージャに認識されない– EntityManager#persist でエンティティを管理対象にし永続化する
– エンティティマネージャがエンティティを管理する場合は、エンティティに永続 ID を設定してデータベースと同期する
– エンティティマネージャから分離され、管理外になった場合は普通の Java オブジェクト
– EntityManager#remove を実行するとデータベースから削除され、管理対象外になるが、 GC が発生するまでメモリ内に残る
12/04/18 Beginning JavaEE6 勉強会 (1)
32
エンティティのライフサイクル
12/04/18 Beginning JavaEE6 勉強会 (1)
管理状態
メモリ内に存在
削除済み状態分離状態
データベース
new GC
persist
remove
refreshsetter
findJPQL
merge
cleardetach
33
コールバックとリスナ
• エンティティで特定のライフサイクルイベントが発生したときの処理 ( コールバック ) を定義できる
• エンティティクラスに直接コールバックを記述できるし、リスナクラスに外出しすることも可能 (@EntityListeners)
• 5 章で!
12/04/18 Beginning JavaEE6 勉強会 (1)
34
コールバックアノテーション
12/04/18 Beginning JavaEE6 勉強会 (1)
管理状態
メモリ内に存在
削除済み状態分離状態
データベース
new GC
@PreLoad@PostLoad
@PreRemove
@PreUpdate@PostUpdate@PostLoad
@PostLoad
@PreUpdate@PostUpdate
@PostLoad
35
ハンズオン演習
12/04/18 Beginning JavaEE6 勉強会 (1)
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)
37
プロジェクトを開く
12/04/18 Beginning JavaEE6 勉強会 (1)
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; // 以下セッター・ゲッター略}
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);
40
練習 3) エンティティの永続化
12/04/18 Beginning JavaEE6 勉強会 (1)
EntityManagerFactory emf = Persistence.createEntityManagerFactory("chapter02PU");EntityManager em = emf.createEntityManager();
41
練習 4) エンティティの永続化
• persist メソッドで永続化します
12/04/18 Beginning JavaEE6 勉強会 (1)
EntityTransaction tx = em.getTransaction();tx.begin();em.persist(book);tx.commit();
em.close();emf.close();
42
main メソッドを実行する前に
• Derby を起動する (接続情報は src/resources/META-INF/persistence.xml)
• 「ウィンドウ」→「サービス」→「データベース」→「 Java DB」→「データベースを作成」
12/04/18 Beginning JavaEE6 勉強会 (1)
43
実行
• main クラスで右クリック→「ファイルを実行」
• 「 java.sql.SQLException: Table/View ‘SEQUENCE’ は、既に Schema ‘APP’ に存在します。」なエラーログは無視
12/04/18 Beginning JavaEE6 勉強会 (1)
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)