More Related Content Similar to Beginning Java EE 6 勉強会(1) #bje_study Similar to Beginning Java EE 6 勉強会(1) #bje_study (20) More from Toshiaki Maki (20) Beginning Java EE 6 勉強会(1) #bje_study2. はじめに - 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) 2
4. 目次
1. Java EE 6の概要
2. Javaと永続化
12/04/18 Beginning JavaEE6 勉強会(1) 4
5. 第1章
Java EE 6の概要
12/04/18 Beginning JavaEE6 勉強会(1) 5
6. 本論に入る前に質問
• 次のうち正しい組み合わせを全て選びなさい
1. J2SE 1.4 – J2EE 1.4
2. J2SE 1.5 – J2EE 1.5
ggrks
3. Java SE 1.5 – Java EE 5
4. Java SE 5 - Java EE 5
5. Java SE 1.6 – Java EE 6
6. Java SE 6 – Java EE 6
7. Java SE 7 – Java EE 6
12/04/18 Beginning JavaEE6 勉強会(1) 6
7. Java EE 6の概要
• 内部アーキテクチャ
• Java EE 6で新しくなった点
12/04/18 Beginning JavaEE6 勉強会(1) 7
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) 8
9. 1.1.1 Java EE 6の歴史
Flexible
Ease of
Development
Java EE 6
Web Services
Pruning,Pro
Rubustness
Enterprise files,EJB
Application
J2EE 1.4 Java EE 5 Lite,JAX-
RS,CDI
Web Annotation
J2EE 1.2 J2EE 1.3
Services, s,EJB3.0,JPA
Manageme ,JAX-WS,JSF
Servlet,JSP, EJB CMP,
nt,Deploym Web Profile
EJB,JMS, JCA
ent
Project JPE RMI/IIOP
Managed
Bean
May 1998 Dec 1999 Sep 2001 Nov 2003 May 2006 Dec 2009
12/04/18 Beginning JavaEE6 勉強会(1) 9
10. Java EE 6の全体像
http://www.slideshare.net/takakiyo/jjuc-ccc-2010-spring より拝借
12/04/18 Beginning JavaEE6 勉強会(1) 10
11. ざっくり分類
• プレゼンテーション層→JSF
• トランザクション層→EJB
• データアクセス層→JPA
• DI、コンポーネント管理→CDI
• メッセージング→JMS
• WEBサービス→JAX-WS、JAX-RS
12/04/18 Beginning JavaEE6 勉強会(1) 11
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) 12
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) 13
14. プロファイル
• Java EEのサブセットをプロファイルとして定
義可能
– Java EEコンテナが特定のプロファイルだけ実装し
てもよい
– WAS8.5ではより軽量なLiberty Profileを提供
Java EE Full Profile
Web Profile
12/04/18 Beginning JavaEE6 勉強会(1) 14
15. 1.2.2 操作性の向上
• JSFやServletの設定が簡単に
• アノテーションの導入でXMLファイル(faces-
config.xml、web.xml)への設定がかなり省略可
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
@ManagedBean
faces-config.xmlの
public class BookController { <managed-bean>タグ内に
@EJB 記述していた情報がアノ
private BookEJB bookEJB; テーションで表現可能に。
private Book book = new Book(); (CDIを使うと@Namedで
private List<Book> bookList; OK)
public String doCreateBook() {
book = bookEJB.createBook(book);
bookList = bookEJB.findBooks();
return "listBooks.xhtml";
}
}
12/04/18 Beginning JavaEE6 勉強会(1) 15
16. 1.2.3 豊富な機能
• JAX-RSでREST対応!
• JPA2.0でデータベース操作がより柔軟に
• EJB3.1でSingleton Session Bean(アプリで唯一のインスタンス)
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;
}
}
12/04/18 Beginning JavaEE6 勉強会(1) 16
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/cl
asses/Hello”);
• 7章で!
12/04/18 Beginning JavaEE6 勉強会(1) 17
18. 第2章
Javaと永続化
12/04/18 Beginning JavaEE6 勉強会(1) 18
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) 19
20. 2.1 JPA仕様の概要
• JavaEE5でJPA1.0が登場
• JPAはJDBCの上位の抽象層
• javax.persistenceパッケージ
• コンポーネント構成
– ORM
– エンティティマネージャ
– Java Persistence Query Language
– トランザクションとロック
– コールバックとリスナ
詳しくは3-5章で!
12/04/18 Beginning JavaEE6 勉強会(1) 20
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) 21
23. 2.1.3 参照実装
• Eclipse Link 2.0
– Oracle社からEclipse Foundation寄贈されたOracle
TopLinkを基盤として開発
• その他の実装では
– Hibernate
– Toplink
– OpenJPA
– DataNucleus
• 以後、永続性プロバイダまたはプロバイダと呼
ぶ
12/04/18 Beginning JavaEE6 勉強会(1) 23
24. 2.2 エンティティ
• オブジェクト エンティティ
• オブジェクトはメモリ内にのみ存在する概念
• エンティティはメモリ+データベース永続化さ
れるオブジェクト
• 具象型でも抽象型でもOK
– 継承・リレーションシップのサポート
• JPQLに問い合わせ
• データベースにアクセスしていることを意識し
ない
12/04/18 Beginning JavaEE6 勉強会(1) 24
25. 2.2.1 オブジェクトリレーショナルマッピング
• 永続化プロバイダがエンティティを認識し、
マッピングを解釈できるように次の2つの形式
で記述
– アノテーション:エンティティのコードにアノテー
ション(javax.persistenceパッケージ)を記述
– XMLディスクリプタ:マッピングを外部XMLファイル
に定義
• Configuration by exceptionの考え方
– デフォルトのマッピング規則(クラス名とテーブル
名は同じ、プロパティ名とカラム名は同じ、等)か
ら外れる場合のみ設定すれば良い。
12/04/18 Beginning JavaEE6 勉強会(1) 25
26. シンプルなBookエンティティ
永続性プロバイダに認識させるため
のアノテーション
@Entity
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;
// 以下セッター・ゲッター略
}
12/04/18 Beginning JavaEE6 勉強会(1) 26
27. エンティティとテーブルのマッピング
<<エンティティ>> Book
Book
+ID bigint nullable=false
-id: Long TITLE varchar(255) nullable=false
-title: String PRICE double nullable=true
-price: Float DESCRIPTION varchar(2000) nullable=true
-description: String ISBN varchar(255) nullable=true
-isbn: String NBOFPAGE integer nullable=true
-nbOfPage: Integer ILLUSTRATIONS smallint nullable=true
-illustrations: Boolean
12/04/18 Beginning JavaEE6 勉強会(1) 27
28. 2.2.2 エンティティのクエリ
• エンティティを操作するAPIが用意されている
• エンティティマネージャが中心に
• CRUD操作やJPQLによる複雑なクエリ
EntityManagerFactory emf = Persistence
.createEntityManagerFactory("chapter02PU");
EntityManager em = emf.createEntityManager();
em.persist(book);
• INSERT文やSELECT文を明示的に記述しなくても
SQLが発行される
12/04/18 Beginning JavaEE6 勉強会(1) 28
29. エンティティマネージャによる操作
<<インタフェース>>
Main EntityManager
DB
+persist(entity: Object): void
+find(entityClass: Class<T>, primaryKey:
Object): <T>
Book
-id: Long
-title: String
-price: Float
-description: String
-isbn: String
-nbOfPage: Integer
-illustrations: Boolean
12/04/18 Beginning JavaEE6 勉強会(1) 29
30. JPQL
• エンティティに対するクエリ言語
• SQLに似ているが少し異なる
“SELECT b FROM Book b WHERE b.title = „HOGE‟"
• 動的クエリ(実行時に生成)、静的クエリ(コンパイル時
に決定)、ネイティブクエリ(SQL)
• 静的クエリは名前付きで設定できる
@Entity
@NamedQuery(name = "findAllBooks", query = "SELECT b FROM Book b")
public class Book {
• createNamedQueryでクエリ取得
Query query = em.createNamedQuery(”findAllBooks");
12/04/18 Beginning JavaEE6 勉強会(1) 30
31. 2.2.3 コールバックとリスナ
• エンティティはPOJO
– newした段階ではメモリ内に存在するだけで、エン
ティティマネージャに認識されない
– EntityManager#persistでエンティティを管理対象
にし永続化する
– エンティティマネージャがエンティティを管理する
場合は、エンティティに永続IDを設定してデータ
ベースと同期する
– エンティティマネージャから分離され、管理外に
なった場合は普通のJavaオブジェクト
– EntityManager#removeを実行するとデータベースか
ら削除され、管理対象外になるが、GCが発生するま
でメモリ内に残る
12/04/18 Beginning JavaEE6 勉強会(1) 31
32. エンティティのライフサイクル
new GC
メモリ内に存
find 在
JPQL
persist
merge remove
分離状態 管理状態 削除済み状態
clear
detach
refresh
setter
データベース
12/04/18 Beginning JavaEE6 勉強会(1) 32
33. コールバックとリスナ
• エンティティで特定のライフサイクルイベント
が発生したときの処理(コールバック)を定義で
きる
• エンティティクラスに直接コールバックを記述
できるし、リスナクラスに外出しすることも可
能(@EntityListeners)
• 5章で!
12/04/18 Beginning JavaEE6 勉強会(1) 33
34. コールバックアノテーション
new GC
メモリ内に存
在
@PostLoad
@PreLoad
@PostLoad @PostLoad
@PreRemove
分離状態 管理状態 削除済み状態
@PreUpdate
@PostUpdate @PreUpdate
@PostUpdate
@PostLoad
データベース
12/04/18 Beginning JavaEE6 勉強会(1) 34
36. ハンズオン演習
• NetBeansとDerbyを使用してJPAアプリケーショ
ンを作成
– http://ja.netbeans.org/
– 実行されたSQLが分かりやすいようにSQLログが出力
されるように設定されています
• 参考 http://bit.ly/log4jdbc
• ハンズオンプロジェクト
– https://www.dropbox.com/sh/1axggidrrjz3rnb/OiM
plS6LJW/beginning-javaee6
12/04/18 Beginning JavaEE6 勉強会(1) 36
38. 練習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;
// 以下セッター・ゲッター略
}
12/04/18 Beginning JavaEE6 勉強会(1) 38
39. 練習2) エンティティの生成
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);
12/04/18 Beginning JavaEE6 勉強会(1) 39
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) 44