狠狠撸
Submit Search
金魚本読書ノート JPA編
?
1 like
?
837 views
K
Kazuyoshi Kamitsukasa
Follow
広島JUG 金魚本読書会の資料。
Read less
Read more
1 of 43
Download now
Downloaded 11 times
More Related Content
金魚本読書ノート JPA編
1.
金鱼本読书ノート(闯笔础)
2.
はじめに ● 金魚本(Beginning Java
EE 6)を読み進める。 ● ソースコードは眺めてわかった気になる。 – https://svn.kenai.com/svn/beginningee6~src/
3.
各章について 第1章 Java EE
6の概要 第2章 Javaと永続化 JPA 第3章 オブジェクト?リレーショナル?マッピング 第4章 永続オブジェクトの管理 第5章 コールバックとリスナ 第6章 Enterprise JavaBeans EJB 第7章 セッションBeanとタイマサービス 第8章 コールバックとインターセプタ 第9章 トランザクションとセキュリティ 第10章 JavaServer Faces JSF 第11章 ページとコンポーネント 第12章 処理と画面遷移 第13章 メッセージの送信 第14章 SOAP Webサービス Webサービス 第15章 RESTful Webサービス 第16章 Java EE 6 ハンズオンラボ
4.
第2章 2.1 ● 2.1
JPA仕様の概要 – ORM – エンティティマネージャAPI – JPQL – トランザクションとロールバック – コールバックとリスナ ● 2.1.1 仕様の歴史 – Hibernate ● 2.1.2 JPA2.0の新機能 – いろいろ ● 2.1.3 参照実装 – EclipseLink 2.0
5.
第2章 2.2 (1/4) ●
2.2 エンティティ – DBに永続化される(マッピングされる)オブジェクト ● 具象型、抽象型、継承、リレーションシップ – ORMにより背後のDBを意識せずエンティティを操作 ● クエリ言語(JPQL) – ライフサイクル
6.
第2章 2.2 (2/4) ●
2.2.1 ORM – オブジェクトとDBテーブルの対応づける – マッピングに使用するメタデータ ● アノテーション – コードに直接記述 ● XMLディスクリプタ – 外部XMLファイルで定義、環境ごとに差異がある場合に有効 – Configuration by exception ● 必要な場合のみデフォルト値を上書きする設定手法 ● convention over configuration – コード2-1
7.
第2章 2.2 (3/4) ●
2.2.2 クエリ – エンティティマネージャ ● エンティティを編成するAPIの中心 ● エンティティの管理、DBからの読み書き、単純なCRUD操 作、JPQLを使用した複雑なクエリの実行 ● Main.java – JPQL ● 動的クエリ、静的クエリ(名前付きクエリ)、ネイティブSQL実行 ● コード2-2 ● コード2-2 (2)
8.
第2章 2.2 (4/4) ●
2.2.3 コールバックとリスナ – エンティティのライフサイクル – 操作(永続化、更新、削除、読込み)の事前?事後イ ベントのインターセプト ● @PrePersist, @PostPersist, @PostUpdate, .. ● https://docs.oracle.com/javaee/6/api/javax/persiste nce/package-summary.html
9.
第3章 3.1 (1/2) ●
3.1 クラスをエンティティにするための規則 – @Entity or XML – @Id – 引数なしのコンストラクタ – final指定は不可 – 値として渡す場合はSerializable
10.
第3章 3.1 (2/2) ●
3.1.1 Configuration-by-Exception – エンティティ名=テーブル名 (変更したければ @Table) – 属性名=カラム名 (変更したければ@Column) – プリミティブ型のマッピングはJDBCの規則を適用 – String=VARCHAR, Long=BIGINT, Boolean= SMALLINT (DBごとに異なる) – その他、カラムのサイズやNullの許容など
11.
第3章 3.2 (1/4) ●
3.2.1 テーブル – @Table ● テーブル名の変更 ● コード3-3 – @SecondaryTable ● 1つのエンティティを複数のテーブルにマッピング ● BLOBを別テーブルに分離するようなケース ● コード3-4
12.
第3章 3.2 (2/4) ●
3.2.2 主キー – @Idと@GeneratedValue ● 主キーに指定できる型はいろいろ。(配列を使うのはどんなとき?) ● 主キーの自動生成は4通り – SEQUENCE, IDENTITY, TABLE, AUTO – 複合主キー ● @EmbeddedId – @Embeddableを付与した主キークラス(equals(), hashCode()) – コード3-7 ● @IdClass – 主キークラスにアノテーションは不要 – 主キークラスとエンティティに属性の定義が重複 ● @EmbeddedIdも@IdClassもテーブル構造は同じ。JPQLでの参照方法などに差がある。 – Select n.newsId.title from News n – Select n.title from News n
13.
第3章 3.2 (3/4) ●
3.2.3 属性 – @Basic ● カラムへのマッピング方法についての基本的な内容を設 定 – Null値の許容、フェッチタイミング ● コード3-14 – @Column ● カラムのプロパティを設定 – カラム名、サイズ、Null値の許容、一意、など ● コード3-16
14.
第3章 3.2 (4/4) ●
3.2.3 属性 (続) – @Temporal ● Date型、Calendar型のマッピング ● コード3-18 – @Transient ● マッピングが不要な属性に付与 – @Enumerated ● 列挙型をマッピング – Integer or String ● コード3-22
15.
第3章 3.2 (4/4) ●
3.2.4 アクセスタイプ – フィールドアクセス(属性)とプロパティアクセス(getter) – @Access – コード3-26 ● 3.2.5 基本型のコレクション – @ElementCollection ● 基本型(=非エンティティ)や組み込み可能オブジェクトのコレクション – @CollectionTable ● テーブル名などを設定 – コード3-27 ● 3.2.6 基本型のマッピング – @MapKeyColumn – コード3-28
16.
第3章 3.3 ● 3.3
XMLによるマッピング – 全てのアノテーションには同等のXMLタグ – XMLの値が優先 – コード3-29 – コード3-30(book_mapping.xml) – コード3-32(persistence.xml)
17.
第3章 3.4 ● 3.4
組み込み可能オブジェクト – @Embeddableと@Embedded ● 複合主キーでは@EmbeddedId – コード3-33 ● 3.4.1 組み込み可能クラスのアクセスタイプ – 組み込み可能クラスのアクセスタイプは、それが含 まれるエンティティのアクセスタイプによって決ま る。 ● 組み込み可能クラスで明示的に指定することを推奨
18.
第3章 3.5 (1/5) ●
3.5 リレーションシップ?マッピング – 方向と多重度 ● 3.5.1 RDBにおけるリレーションシップ – カラム結合とテーブル結合
19.
第3章 3.5 (2/5) ●
3.5.2 リレーションシップ – @OneToOne、一方向 ● カラム結合 ● コード3-38 ● コード3-43 – @JoinColumnを使って外部キーのマッピングをカスタマイズ – @OneToMany、一方向 ● テーブル結合 (or カラム結合) ● コード3-44 ● コード3-47 – @JoinTableを使ってテーブル結合のマッピングをカスタマイズ ● コード3-49 – @JoinColumnを使えばカラム結合へ変更
20.
第3章 3.5 (3/5) ●
3.5.2 リレーションシップ (続) – @ManyToMany、双方向 ● テーブル結合 ● コード3-50 – 被所有者側にmappedBy ● 指定しない場合は2つの一方向リレーションシップ(=2つの テーブル結合) ● テーブル結合のカスタマイズは@JoinTable
21.
第3章 3.5 (4/5) ●
3.5.3 リレーションシップのフェッチ – EAGER ● メモリは消費するがDBへのアクセス回数は少なくなる(永 続性プロバイダはおそらく結合クエリを使用してデータ を抽出) – LAZY ● メモリを使い果たすリスクはなくなるが、毎回DBにアク セスする
22.
第3章 3.5 (5/5) ●
3.5.4 リレーションシップの順序 – @OrderBy ● コレクションの取得時にorder by句を使用するよう指示 ● マッピングには影響しない ● コード3-53 – @OrderColumn ● 永続化においても順序を維持するよう指示 ● テーブル結合にマッピング ● コード3-56 – @OrderByと@OrderColumnは同時に使用できない
23.
第3章 3.6 (1/5) ●
3.6 継承のマッピング – オブジェクトの階層モデルをフラットなリレーショ ナルモデルにマッピングする3つの方式 ● クラス階層ごとに1つのテーブル ● 結合サブクラス ● 具象クラスごとのテーブル(JPA2.0ではoption) – @Inheritance ● マッピング方式の指定
24.
第3章 3.6 (2/5) ●
3.6.1 継承方式 – クラス階層ごとに1つのテーブル(SINGLE_TABLE) ● 継承関係にあるエンティティの全属性を1テーブルに ● @Inheritanceのデフォルト ● コード3-58 ● 識別子カラム – @DiscriminatorColumn, @DiscriminatorValue – コード3-61 ● 欠点 – 階層に新エンティティを追加する場合、既存エンティティに属性を追加す る場合のテーブル変更 – 子エンティティの属性はNull値を許容
25.
第3章 3.6 (3/5) ●
3.6.1 継承方式 (続) – 結合サブクラス(JOINED) ● 階層内の各エンティティを専用のテーブルにマッピング – 継承している属性は子エンティティに対応するテーブルのカラ ムにマッピングされない ● コード3-64 ● 識別子カラム ● 欠点 – 階層が深くなれば結合操作が多くなる
26.
第3章 3.6 (4/5) ●
3.6.1 継承方式 (続) – 具象クラスごとのテーブル(TABLE_PER_CLASS) ● 階層内の各エンティティを専用のテーブルにマッピング – 継承している属性も子エンティティに対応するテーブルのカラムにマッピングされる ● 識別子カラム不要 ● 階層内の全テーブルを通じて一意となる共通の主キーが必要 ● コード3-65 ● 欠点 – クラス階層全体を対象とするポリモルフィックなクエリにコストがかかる(UNIONを使う ことになるから) – 属性のオーバーライド ● @AttributeOverride, @AttributeOverrides ● コード3-66
27.
第3章 3.6 (5/5) ●
3.6.2 継承階層に含まれるクラスの種類 – 抽象エンティティ (abstract) ● マッピングには影響なし、Javaにおいてインスタンスを生成できないだけ – 非エンティティ (POJO) ● 非エンティティから継承している属性は永続化されない ● コード3-68 – マップドスーパークラス ● マッピング先のテーブルはない ● マップドスーパークラスの属性は、子エンティティテーブルのカラムにマッピ ングされる – 組み込み可能クラスとほぼ同じ ● @MappedSuperclass ● コード3-71
28.
第4章 4.1 ● 4.1
エンティティをクエリする方法 – コード4-1 – コード4-3(persistence.xml)
29.
第4章 4.2 (1/8) ●
4.2 エンティティマネージャ – 「JPAの利点は、エンティティをアプリケーション のさまざまなレイヤーで通常のオブジェクトとして 使用しながら、DBへデータの読み書きが必要になっ たおきに、エンティティマネージャがそのエンティ ティを管理するようになるという点です。」 – EntityManagerインターフェース
30.
第4章 4.2 (2/8) ●
4.2.1 エンティティマネージャの取得 – アプリケーション管理の環境 ● EntityManagerの生成やクローズが必要 ● EntityManagerFactory ● コード4-2 – コンテナ管理の環境(第6章) ● EntityManagerの生成やクローズが不要 ● @PersistenceContext or JNDIルックアップ ● コード例
31.
第4章 4.2 (3/8) ●
4.2.2 永続性コンテキスト – 「あるユーザーのトランザクションに関して、ある タイミングで管理されているエンティティのインス タンスの集合」 ● 1つの永続性コンテキストに同一のエンティティが重複し て存在することはできない – レベル1キャッシュ ● トランザクションが終了すると永続性コンテキストも終 了し、エンティティはクリア – コード4-6(persistence.xml)
32.
第4章 4.2 (4/8) ●
4.2.3 エンティティの操作 – EntityManagerインターフェース – コード4-7 – エンティティの永続化 ● EntityManager.persist() – コード4-9 – persistを呼び出す順序は逆でも良い。エンティティマネージャ がフラッシュ時によしなにしてくれる
33.
第4章 4.2 (5/8) ●
4.2.3 エンティティの操作 (続) – IDによる検索 ● EntityManager.find() – コード4-10 ● EntityManager.getReference() – コード4-11 – 主キー以外のデータは遅延フェッチ – エンティティの削除 ● EntityManager.remove() – コード4-12 – 孤立したオブジェクトの削除 ● OrphanRemoval – 1対1または1対多の関連において、ターゲットが複数のソースに所有されない場合に、ソー スを削除するとターゲットも削除
34.
第4章 4.2 (6/8) ●
4.2.3 エンティティの操作 (続) – データベースとの同期 ● EntityManager.flush() – 永続性コンテキストのフラッシュを強制 – 整合性制約を満たさない ● EntityManager.refresh() – メモリ内のエンティティに対する変更を戻す – コード4-14 – 永続性コンテキストの内容 ● EntityManager.contains() – エンティティが管理対象か確認 – コード4-15 ● EntityManager.clear() – 永続性コンテキストを空にする ● EntityManager.detach() – 永続性コンテキストから指定エンティティを分離 – コード4-16
35.
第4章 4.2 (7/8) ●
4.2.3 エンティティの操作 (続) – エンティティのマージ ● EntityManager.merge() – 永続性コンテキストから分離されたエンティティへの変更を永続化する場合 – コード4-17 – エンティティの更新 ● 管理対象であるエンティティへの変更はコミット時にDBへ反映さ れる – イベントのカスケード ● 関連するエンティティにイベントを連鎖 – PERSIST, REMOVE, MERGE, REFRESH, DETACH, ALL
36.
第4章 4.2 (8/8) ●
4.2.4 キャッシュAPI – パフォーマンスキャッシュ(レベル2キャッシュ) ● アプリケーション全体で使用できるキャッシュ – Cacheインターフェース – @Cacheable ● コード4-23 – shared-cache-mode (SharedCacheMode) ● ALL, DISABLE_SELECTIVE, ENABLE_SELECTIVE, NONE, UNSPECIFIED ● persistence.xml – コード4-24
37.
第4章 4.3 (1/2) ●
4.3 JPQL – SQLの構文を起源とするクエリ言語 – コード4-25 ● 4.3.1 SELECT句 – エンティティ, エンティティの属性, コンストラクタ式, 集計関数 ● 4.3.2 FROM句 – 識別変数 ● 4.3.3 WHERE句 – 論理演算子, 比較演算子 – パラメータのバインド ● 位置指定: ?1, ?2, .. , ?N ● 名前付き: :fname, :contury – サブクエリ
38.
第4章 4.3 (2/2) ●
4.3.4 ORDER BY句 – ASC, DESC ● 4.3.5 GROUP BY句とHAVING句 – グループ化とフィルタ ● 4.3.6 一括削除 – DELETE文 ● 4.3.7 一括更新 – UPDATE文
39.
第4章 4.4 (1/2) ●
4.4 クエリ – 4種類のクエリ: 動的クエリ、名前付きクエリ、ネイティブクエリ、Criteria API – EntityManagerインターフェース – Queryインターフェース ● 4.4.1 動的クエリ – EntityManager.createQuery() ● コード例 – 実行時にJPQL文字列をSQL文に変換するコスト ● 4.4.2 名前付きクエリ – @NamedQuery ● コード4-27 – EntityManager.createNamedQuery() ● コード例 – クエリ名は永続性ユニットごとにユニーク
40.
第4章 4.4 (2/2) ●
4.4.3 ネイティブクエリ – 結果をエンティティに自動変換する点がJDBC呼び出しと異なる – EntityManager.createNativeQuery() – @NamedNativeQuery ● 4.4.4 Criteria API – オブジェクト指向クエリ ● コード4-30 – 静的メタモデルクラス ● 属性の参照もタイプセーフに ● コード4-34
41.
第4章 4.5 ● 4.5
同時実行 – lock, find, refresh – LockModeType ● 4.5.1 バージョニング – @Version ● コード4-35 ● Version属性は永続性プロバイダのみが更新してよい ● コード4-36 ● 4.5.2 楽観的ロック – 明示的にロックする or @Versionをつける – OPTIMISTIC, OPTIMISTIC_FORCE_INCREMENT – コード例 ● 4.5.3 悲観的ロック – PESSIMISTIC_READ, PESSIMISTIC_WRITE, PESSIMISTIC_FORCE_INCREMENT
42.
第5章 ● 5.1 エンティティのライフサイクル –
ライフサイクル ● 5.2 コールバック – @PrePersist, @PostPersist – @PreUpdate, @PostUpdate – @PreRemove, @PostRemove – @PostLoad – コード5-1
43.
第5章 ● 5.3 リスナ –
コールバックメソッドを別クラスに抜き出し、複数のエン ティティから共有 ● Object型もしくはエンティティ型のパラメータをとる点でコール バックメソッドとはシグネチャが異なる – @EntityListenersでリスナを登録 ● コード5-2 – @ExcludeSuperclassListeners, @ExcludeDefaultListeners ● コード5-5 ● コード5-7
Download