目錄
第一部分 EJB概述
第1章 EJB3是什麼 2
1.1 EJB概述 3
1.1.1 EJB作為組件 3
1.1.2 EJB作為框架 4
1.1.3 分層架構和EJB 5
1.1.4 為什麼選擇EJB3 8
1.2 了解EJB類型 9
1.2.1 會話bean 10
1.2.2訊息驅動bean11
1.2.3 實體和JPA11
1.3 深入EJB 12
1.3.1 訪問EJB服務:EJB容器 13
1.3.2 訪問JPA服務:持久化提供器 13
1.3.3 使用EJB服務的功能 14
1.4 EJB的新生 15
1.4.1 HelloUser示例 16
1.4.2 簡化的程式設計模型 17
1.4.3 用註解,不用部署描述檔案 17
1.4.4 依賴注入與JNDI查找 18
1.4.5 簡化的持久化API 18
1.4.6 可進行單元測試的POJO組件 19
1.4.7 EJB3和Spring 20
1.5 小結 21
第2章 EJB3初體驗 22
2.1 新特性:簡化EJB 23
2.1.1 使用註解替換部署描述檔案 23
2.1.2 依賴注入簡介 26
2.2 ActionBazaar應用程式簡介 27
2.2.1 從構造的一個子集開始 27
2.2.2 基於EJB3的解決方案 28
2.3 使用會話bean構造業務邏輯 30
2.3.1 使用無狀態bean 30
2.3.2 無狀態bean客戶端 31
2.3.3 使用有狀態bean 33
2.3.4 有狀態bean客戶端 36
2.4 訊息和訊息驅動bean 38
2.4.1 生成賬單訊息 38
2.4.2 使用訂單賬單訊息處理器MDB41
2.5 使用EJB3JPA持久化數據 42
2.5.1 使用JPA 43
2.5.2 使用EntityManager 45
2.6 小結 47
第二部分 使用EJB3構造業務邏輯
第3章 使用會話bean構造業務邏輯 50
3.1 會話bean簡介 50
3.1.1 為什麼使用會話bean 51
3.1.2 會話bean基礎 52
3.1.3 了解程式設計原則 54
3.1.4 會話狀態和會話bean類型 55
3.1.5 bean生命周期回調 55
3.2 無狀態會話bean 57
3.2.1 BidManagerBean示例 58
3.2.2 使用@stateless註解 60
3.2.3 指定業務接口 61
3.2.4 使用bean生命周期回調 63
3.3 有狀態會話bean 65
3.3.1 附加程式設計原則 66
3.3.2 BidderAccountCreatorBean示例 66
3.3.3 有狀態bean的業務接口 69
3.3.4 有狀態bean的生命周期回調 70
3.4 會話bean客戶端 72
3.4.1 使用@EJB註解 73
3.4.2 注入和有狀態會話bean 74
3.5 有狀態bean的性能注意事項 74
3.5.1 有效地使用有狀態會話bean 74
3.5.2 有狀態會話bean的替代方式 75
3.6 會話bean最佳實踐 76
3.7 小結 76
第4章 訊息和開發MDB 77
4.1 訊息概念 77
4.1.1面向訊息的中間件 78
4.1.2 ActionBazaar中的訊息 78
4.1.3 訊息模型 80
4.2Java訊息服務簡介 81
4.2.1 開發JMS訊息生產者 82
4.2.2 JMS訊息接口 83
4.3 使用訊息驅動bean 85
4.3.1 為什麼使用MDB 85
4.3.2 程式設計原則 86
4.3.3 使用MDB開發訊息消費者 87
4.3.4 使用@MessageDriven註解 89
4.3.5 實現MessageListener 89
4.3.6 使用ActivationConfig-Property 90
4.3.7 使用bean生命周期回調 93
4.3.8 從MDB傳送JMS訊息 95
4.3.9 管理MDB事務 96
4.4 MDB最佳實踐 96
4.5 小結 97
第5章 學習高級EJB概念 99
5.1 EJB內幕 99
5.1.1 幕後的EJB 99
5.1.2 EJB上下文:訪問運行時環境 100
5.2 使用依賴注入和JNDI訪問資源 103
5.2.1 使用@Resource注入資源 103
5.2.2 @Resource註解實際套用 107
5.2.3 查找資源和EJB 109
5.3 EJB中的AOP:攔截器 110
5.3.1 AOP是什麼 111
5.3.2 攔截器是什麼 111
5.3.3 指定攔截器 113
5.3.4 實現業務攔截器 114
5.3.5 攔截器類中的回調方法 117
5.4 調度:EJB3計時器服務 118
5.4.1 計時器是什麼 118
5.4.2 使用計時器服務 119
5.4.3 何時使用EJB計時器 123
5.5 小結 124
第6章 事務和安全 125
6.1 了解事務 125
6.1.1 ActionBazaar中的事務解決方案 126
6.1.2 ACID屬性 126
6.1.3 事務管理內幕 128
6.1.4 兩階段提交 129
6.1.5 EJB中的事務管理 130
6.2 容器管理的事務 130
6.2.1 使用CMT實現Snag-It訂購 130
6.2.2 @TransactionManagement註解 131
6.2.3 @TransactionAttribute註解 132
6.2.4 使CMT使用回調 134
6.2.5 事務和異常處理 135
6.3 bean管理的事務 138
6.3.1 使用BMT實現Snag-It訂購 138
6.3.2 獲得UserTransaction 139
6.3.3 使用UserTransaction 140
6.3.4 BMT的優缺點 141
6.4 分析EJB安全 142
6.4.1 驗證和授權 142
6.4.2 用戶、組和角色 142
6.4.3 ActionBazaar中的安全問題 143
6.4.4 EJB3和JavaEE安全 144
6.4.5 聲明式安全 146
6.4.6 使用EJB程式式安全 148
6.5 小結 150
第三部分 研究JPA
第7章 實現域模型 152
7.1 域建模和JPA 152
7.1.1 介紹域模型 153
7.1.2 ActionBazaar問題域 153
7.1.3 域模型參與者 155
7.1.4 EJB3Java持久化API 156
7.1.5 域對象作為Java類 157
7.2 使用JPA實現域對象 159
7.2.1 @Entity註解 159
7.2.2 持久化實體數據 160
7.2.3 指定實體身份 163
7.2.4 @Embeddable註解 167
7.3 實體關係 168
7.3.1 @OneToOne 168
7.3.2 @OneToMany和@ManyToOne 171
7.3.3 @ManyToMany 173
7.4 小結 175
第8章對象關係映射176
8.1 阻抗失配 176
8.1.1 把對象映射到資料庫 177
8.1.2 介紹O/R映射 180
8.2 映射實體 181
8.2.1 指定表 183
8.2.2 映射列 184
8.2.3 使用@Enumerated 185
8.2.4 映射CLOB和BLOB 186
8.2.5 映射臨時類型 186
8.2.6 把實體映射到多個表 187
8.2.7 生成主鍵 188
8.2.8 映射可嵌入類 190
8.3 映射實體關係 192
8.3.1 映射一對一關係 193
8.3.2 一對多和多對一 196
8.3.3 多對多 198
8.4 映射繼承 200
8.4.1 單表策略 201
8.4.2 聯結表策略 202
8.4.3 每個類一個表策略 204
8.4.4 映射多態關係 206
8.5 小結 206
第9章 使用EntityManager操作實體 207
9.1 介紹EntityManager 207
9.1.1 EntityManager接口 208
9.1.2 實體的生命周期 210
9.1.3 持久化上下文、作用域和EntityManager 212
9.1.4 在ActionBazaar中使用EntityManager 213
9.2 創建EntityManager實例 215
9.2.1 容器管理的EntityManager 215
9.2.2 應用程式管理的EntityManager 217
9.3 管理持久化操作 222
9.3.1 持久化實體 222
9.3.2 通過主鍵檢索實體 226
9.3.3 更新實體 230
9.3.4 刪除實體 232
9.3.5 通過轉儲清除控制更新 233
9.3.6 刷新實體 234
9.4 實體生命周期監聽器 236
9.4.1 使用實體監聽器 236
9.4.2 默認監聽器類 238
9.4.3 監聽器類的執行順序和排除 238
9.5 實體操作最佳實踐 239
9.6 小結 240
第10章 使用查詢API和JPQL檢索實體 241
10.1 介紹查詢API 241
10.1.1 背景 241
10.1.2 剖析查詢 242
10.1.3 定義命名查詢 243
10.2 執行查詢 244
10.2.1 創建查詢實例 244
10.2.2 使用Query接口 246
10.2.3 指定查詢提示 250
10.3 介紹JPQL 251
10.3.1 定義語句類型 251
10.3.2 使用FROM子句 253
10.3.3 條件表達式和操作 256
10.3.4 使用JPQL函式 259
10.3.5 使用SELECT子句 261
10.3.6 使用聚合 263
10.3.7 排序查詢結果 264
10.3.8 使用子查詢 265
10.3.9 聯結實體 266
10.3.10 批更新和批刪除 268
10.4 原生SQL查詢 268
10.4.1 使用原生SQL的動態查詢 269
10.4.2 使用命名原生SQL查詢 270
10.5 小結 271
第四部分 EJB3的實際套用
第11章 打包EJB3應用程式 274
11.1 給應用程式打包 275
11.1.1 剖析EAR檔案 276
11.1.2 載入EAR模組 277
11.2 分析類載入 279
11.2.1 類載入基礎 279
11.2.2 分析典型的父委託模型 281
11.2.3 JavaEE應用程式中的類載入 282
11.2.4 JavaEE模組之間的相關性 282
11.3 打包會話bean和訊息驅動bean 284
11.3.1 打包EJB-JAR 284
11.3.2 部署描述檔案與註解 285
11.3.3 使用部署描述檔案覆寫註解 288
11.3.4 指定默認攔截器設定 289
11.3.5 使用廠商專有的註解和描述檔案 289
11.4 打包實體 290
11.4.1 暴露持久化模組 291
11.4.2 使用persistence.xml描述持久化模組 291
11.4.3 使用orm.xml執行O/R映射 296
11.5 最佳實踐和常見部署問題 299
11.5.1 打包和部署最佳實踐 299
11.5.2 診斷常見部署問題 300
11.6 小結 301
第12章 有效地跨越應用程式層集成EJB3
12.1 設計模式和Web技術 302
12.1.1 表現層 303
12.1.2 使用EAO模式 305
12.1.3 介紹SessionFacade模式 308
12.2 從Web層訪問會話bean 312
12.2.1 使用依賴注入訪問會話bean 313
12.2.2 從幫助器類引用會話bean 314
12.2.3 處理事務 316
12.2.4 處理有狀態會話bean 317
12.3 從Web層使用JPA 318
12.3.1 使用容器管理的實體管理器 318
12.3.2 通過JTA事務使用應用程式管理的EntityManager 320
12.3.3 在容器外訪問應用程式管理的EntityManager 321
12.4 小結 323
第13章 馴服EJB:性能和可伸縮性 324
13.1 處理實體鎖定問題 325
13.1.1 了解鎖定類型 325
13.1.2樂觀鎖定和實體版本 327
13.1.3 EntityManager和鎖定模式 328
13.2 提高實體性能 330
13.2.1 重新建模和重新設計計畫 330
13.2.2 最佳化JDBC層 333
13.2.3 減少資料庫操作 334
13.2.4 提高查詢性能 337
13.2.5 快取 340
13.3 提高EJB3組件的性能 344
13.3.1 會話bean性能 344
13.3.2 提高MDB性能 346
13.4 集群EJB應用程式 347
13.4.1 協同定位架構 348
13.4.2 無狀態會話bean的負載平衡 348
13.4.3 集群有狀態會話bean 350
13.4.4 實體和集群快取 352
13.5 小結 353
第五部分 移植和互操作性
第14章 移植到EJB3 356
14.1 與EJB2的向後兼容性和互操作性 356
14.1.1 將EJB2和EJB3打包在一起 357
14.1.2 從EJB3調用EJB2 357
14.1.3 從EJB2使用EJB3 358
14.2 移植會話bean 360
14.2.1 轉換接口和bean類 360
14.2.2 資源使用 363
14.2.3 事務和安全設定 364
14.2.4 客戶端應用程式 364
14.3 移植訊息驅動bean 365
14.4 把CMP2實體移植到EJB3JPA 366
14.4.1 重新設計域模型 366
14.4.2DTO用作實體 369
14.4.3 實體bean類和接口 370
14.4.4 客戶端應用程式 376
14.5 移植JDBCDAO使用EJB3JPA 377
14.5.1 標識實體 378
14.5.2 重新構造DAO實現類使用EntityManagerAPI 379
14.5.3 SQL查詢轉換為JPQL 380
14.6 幫助O/R框架使用EJB3JPA 381
14.7 移植方法 382
14.7.1 策略 383
14.7.2 手工與自動 383
14.8 小結 383
第15章 把EJB暴露為Web服務 384
15.1 Web服務是什麼 385
15.1.1 認識Web服務組件 386
15.1.2 Web服務樣式 391
15.1.3 開發Web服務的方法 391
15.2 JAX-WS:JavaEE5Web服務平台 392
15.2.1 介紹Web服務平台 392
15.2.2 與POJO相比,為什麼選擇EJB用於Web服務 393
15.3 使用JAX-WS2.0開發EJBWeb服務 393
15.3.1 使用@WebService註解 395
15.3.2 使用@SOAPBinding指定Web服務樣式 396
15.3.3 使用@WebMethod註解 397
15.3.4 使用@WebParam註解 399
15.3.5 使用@WebResult註解 400
15.3.6 使用@oneway和@HandlerChain註解 400
15.4 從EJB訪問Web服務 401
15.4.1 訪問PlaceBidWeb服務 401
15.4.2 EJB作為Web服務客戶 403
15.5 Web服務開發的最佳實踐 404
15.6 小結 405
第16章 EJB3和Spring 406
16.1 Spring框架簡介 407
16.1.1 Spring框架的優勢 407
16.1.2 控制反轉原理 408
16.1.3 關注分離原理 408
16.2 通過Spring使用JPA 409
16.2.1 構造Spring的JPAEAO 410
16.2.2 配置Spring使用JPA 412
16.3 結合EJB3和Spring的功能 415
16.3.1 開發支持Spring的EJB 415
16.3.2 從Springbean使用會話bean 417
16.4 小結 418
附錄A RMI和JNDI 420
附錄B 複習關係資料庫 426
附錄C 註解參考 431
附錄D 部署描述檔案參考 447
附錄E 安裝和配置JavaEE5SDK 462
資源 472
索引 475
……