內容簡介
JPA(Java Persistence API)是Oracle公司制定的標準Java持久化API。Hibernate是非常流行的對象-關係映射工具,Hibernate實現了JPA。本書詳細介紹了運用JPA以及目前最成熟的Hibernate 5版本進行Java對象持久化的技術。Hibernate是連線Java對象模型和關係數據模型的橋樑,通過本書,讀者不僅能掌握用JPA和Hibernate工具對這兩種模型進行映射的技術,還能獲得設計與開發Java對象模型和關係數據模型的先進經驗。本書將幫助讀者編寫出具有合理的軟體架構,以及好的運行性能和並發性能的實用應用程式。書中內容注重理論與實踐相結合,列舉了大量具有典型性和實用價值的套用實例,並提供了詳細的開發和部署步驟。
圖書目錄
第1章Java套用分層架構及軟體模型
1.1應用程式的分層體系結構
1.1.1區分物理分層和邏輯分層
1.1.2軟體層的特徵
1.1.3軟體分層的優點
1.1.4軟體分層的缺點
1.1.5Java套用的持久化層
1.2軟體的模型
1.2.1概念模型
1.2.2關係數據模型
1.2.3域模型
1.3小結
1.4思考題
第2章Java對象持久化技術概述
2.1直接通過JDBC API來持久化實體域對象
2.2ORM簡介
2.2.1對象關係映射的概念
2.2.2描述對象關係映射信息的元數據
2.2.3訪問ORM中間件的API
2.2.4常用的ORM中間件
2.3實體域對象的其他持久化模式
2.3.1主動域對象模式
2.3.2CMP模式
2.3.3運用ORM的JPA模式
2.4小結
2.5思考題
第3章第一個helloapp套用
3.1創建Hibernate的配置檔案
3.1.1用Java屬性檔案作為Hibernate配置檔案
3.1.2XML格式的Hibernate配置檔案
3.2創建持久化類
3.3創建資料庫Schema
3.4創建對象關係映射檔案
3.4.1映射檔案的文檔類型定義(DTD)
3.4.2把Customer持久化類映射到CUSTOMERS表
3.5通過Hibernate API操縱資料庫
3.5.1Hibernate的初始化
3.5.2Hibernate的遺留初始化方式
3.5.3訪問Hibernate的Session接口
3.6運行helloapp套用
3.6.1創建用於運行本書範例的系統環境
3.6.2創建helloapp套用的目錄結構
3.6.3把helloapp套用作為獨立應用程式運行
3.6.4把helloapp套用作為Java Web套用運行
3.7小結
3.8思考題
第4章使用註解和JPA
4.1創建包含註解的持久化類
4.2方式一: 註解和Hibernate API
4.2.1創建Hibernate配置檔案
4.2.2自動創建資料庫表
4.2.3使用Hibernate API
4.3方式二: 註解和JPA API
4.3.1創建JPA的配置檔案
4.3.2使用JPA API
4.3.3從JPA API中獲得Hibernate API
4.4方式三: 對象關係映射檔案和JPA API
4.5小結
4.6思考題
第5章對象關係映射基礎
5.1持久化類的屬性及訪問方法
5.1.1基本類型屬性和包裝類型屬性
5.1.2訪問持久化類屬性的方式
5.1.3在持久化類的訪問方法中加入程式邏輯
5.1.4設定派生屬性
5.1.5控制insert和update語句
5.1.6映射枚舉類型
5.2處理SQL引用標識符
5.3創建命名策略
5.4設定資料庫Schema
5.5運行範例程式
5.6使用Hibernate的對象關係映射檔案
5.6.1設定訪問持久化類屬性的方式
5.6.2映射Customer類的虛擬name屬性
5.6.3忽略Customer類的avgPrice屬性
5.6.4映射Customer類的sex屬性
5.6.5映射Customer類的totalPrice派生屬性
5.6.6控制insert和update語句
5.6.7映射Customer類的description屬性
5.6.8設定自定義的命名策略
5.6.9設定資料庫Schema
5.6.10設定類的包名
5.7小結
5.8思考題
第6章映射對象標識符
6.1關係資料庫按主鍵區分不同的記錄
6.1.1把主鍵定義為自動增長標識符類型
6.1.2從序列(Sequence)中獲取自動增長的標識符
6.2Java語言按記憶體地址區分不同的對象
6.3Hibernate用對象標識符(OID)來區分對象
6.4Hibernate的內置標識符生成器的用法
6.4.1increment標識符生成器
6.4.2identity標識符生成器
6.4.3sequence標識符生成器
6.4.4table標識符生成器
6.4.5auto標識符生成器
6.5映射自然主鍵
6.5.1映射單個自然主鍵
6.5.2映射複合自然主鍵
6.6映射派生主鍵
6.7使用Hibernate的對象關係映射檔案
6.7.1increment標識符生成器
6.7.2identity標識符生成器
6.7.3sequence標識符生成器
6.7.4auto(native)標識符生成器
6.7.5映射單個自然主鍵
6.7.6映射複合自然主鍵
6.7.7映射派生主鍵
6.8小結
6.9思考題
第7章映射一對多關聯關係
7.1映射多對一單向關聯關係
7.1.1TransientPropertyValueException異常
7.1.2級聯持久化
7.2映射一對多雙向關聯關係
7.2.1建立持久化對象之間的關聯關係
7.2.2級聯刪除
7.2.3父子關係
7.3映射一對多雙向自身關聯關係
7.4改進持久化類
7.5使用Hibernate的對象關係映射檔案
7.5.1映射多對一單向關聯關係
7.5.2映射一對多雙向關聯關係
7.5.3映射一對多雙向自身關聯關係
7.6小結
7.7思考題
第8章通過JPA和Hibernate操縱對象(上)
8.1Java對象在JVM中的生命周期
8.2理解持久化快取
8.2.1持久化快取的作用
8.2.2髒檢查及清理快取的機制
8.3Java對象在持久化層的狀態
8.3.1臨時對象(Transient Object)的特徵
8.3.2持久化對象(Persistent Object)的特徵
8.3.3被刪除對象(Removed Object)的特徵
8.3.4游離對象(Detached Object)的特徵
8.4Session接口的用法
8.4.1Session的save()方法和persist()方法
8.4.2Session的load()方法和get()方法
8.4.3Session的update()方法
8.4.4Session的saveOrUpdate()方法
8.4.5Session的merge()方法
8.4.6Session的delete()方法
8.4.7Session的replicate()方法
8.4.8Session的byId()方法
8.4.9Session的refresh()方法
8.5EntityManager接口的用法
8.6通過Hibernate API級聯操縱對象圖
8.6.1級聯保存臨時對象
8.6.2更新持久化對象
8.6.3持久化臨時對象
8.6.4更新游離對象
8.6.5遍歷對象圖
8.7通過JPA API級聯操縱對象圖
8.8小結
8.9思考題
第9章通過JPA和Hibernate操縱對象(下)
9.1與觸發器協同工作
9.2利用攔截器(Interceptor)生成審計日誌
9.3Hibernate的事件處理API
9.4利用Hibernate的Envers生成審計日誌
9.5JPA的事件處理API
9.6批量處理數據
9.6.1通過EntityManger或Session來進行批量操作
9.6.2通過StatelessSession來進行批量操作
9.6.3通過JPQL來進行批量操作
9.6.4直接通過JDBC API來進行批量操作
9.7通過JPA訪問元數據
9.8調用存儲過程
9.9小結
9.10思考題
第10章映射組成關係
10.1建立精粒度對象模型
10.2建立粗粒度關係數據模型
10.3映射組成關係
10.3.1區分值(Value)類型和實體(Entity)類型
10.3.2在應用程式中訪問具有組成關係的持久化類
10.4映射複合組成關係
10.5使用Hibernate的對象關係映射檔案
10.5.1映射組成關係
10.5.2映射複合組成關係
10.6小結
10.7思考題
第11章Hibernate的映射類型
11.1Hibernate的內置映射類型
11.1.1Java基本類型以及數字類型的Hibernate映射類型
11.1.2Java時間和日期類型的Hibernate映射類型
11.1.3Java大對象類型的Hibernate映射類型
11.1.4JDK自帶的個別Java類的Hibernate映射類型
11.1.5使用Hibernate內置映射類型
11.2客戶化映射類型
11.2.1用客戶化映射類型取代Hibernate組件
11.2.2用UserType映射枚舉類型
11.2.3實現CompositeUserType接口
11.2.4運行本節範例程式
11.3使用JPA Converter(類型轉換器)
11.4操縱Blob和Clob類型數據
11.5小結
11.6思考題
第12章映射繼承關係
12.1繼承關係樹的每個具體類對應一個表
12.1.1用註解來映射
12.1.2用對象關係映射檔案來映射
12.1.3操縱持久化對象
12.1.4其他映射方式
12.2繼承關係樹的根類對應一個表
12.2.1用註解來映射
12.2.2用對象關係映射檔案來映射
12.2.3操縱持久化對象
12.3繼承關係樹的每個類對應一個表
12.3.1用註解來映射
12.3.2用對象關係映射檔案來映射
12.3.3操縱持久化對象
12.4選擇繼承關係的映射方式
12.5映射複雜的繼承樹
12.5.1用註解來映射
12.5.2用對象關係映射檔案來映射
12.6映射多對一多態關聯
12.7小結
12.8思考題
第13章Java集合類
13.1Set(集)
13.1.1Set的一般用法
13.1.2HashSet類
13.1.3TreeSet類
13.1.4向Set中加入持久化類的對象
13.2List(列表)
13.3Map(映射)
13.4小結
13.5思考題
第14章映射值類型集合
14.1映射Set(集)
14.2映射Bag(包)
14.3映射List(列表)
14.4映射Map(映射)
14.5對集合排序
14.5.1在資料庫中對集合排序
14.5.2在記憶體中對集合排序
14.6映射組件類型集合
14.7小結
14.8思考題
第15章映射實體關聯關係
15.1映射一對一關聯
15.1.1按照外鍵映射
15.1.2按照主鍵映射
15.2映射單向多對多關聯
15.3映射雙向多對多關聯關係
15.3.1用@ManyToMany註解映射雙向關聯
15.3.2使用組件類集合
15.3.3把多對多關聯分解為兩個一對多關聯
15.4小結
15.5思考題
第16章Hibernate的檢索策略
16.1Hibernate的檢索策略簡介
16.2類級別的檢索策略
16.2.1立即檢索
16.2.2延遲檢索
16.3一對多和多對多關聯的檢索策略
16.3.1立即檢索(FetchType.EAGER)
16.3.2多查詢語句立即檢索(FetchMode.SELECT)
16.3.3延遲檢索(FetchType.LAZY)
16.3.4增強延遲檢索(LazyCollectionOption.EXTRA)
16.3.5批量檢索(@BatchSize註解)
16.3.6使用子查詢語句(FetchMode.SUBSELECT)
16.4多對一和一對一關聯的檢索策略
16.4.1立即檢索(FetchType.EAGER)
16.4.2延遲檢索(FetchType.LAZY)
16.4.3無代理延遲檢索
16.4.4批量檢索(@BatchSize註解)
16.5控制左外連線檢索的深度
16.6在程式中動態指定立即左外連線檢索
16.7定義和檢索對象圖
16.8用@FecthProfile註解指定檢索規則
16.9屬性級別的檢索策略
16.10小結
16.11思考題
第17章檢索數據API(上)
17.1檢索方式簡介
17.1.1JPQL檢索方式
17.1.2QBC檢索方式
17.1.3本地SQL檢索方式
17.1.4關於本章範例程式
17.1.5使用別名
17.1.6多態查詢
17.1.7對查詢結果排序
17.1.8分頁查詢
17.1.9檢索單個對象(getSingleResult()方法)
17.1.10按主鍵依次處理查詢結果(屬於Hibernate的功能)
17.1.11可滾動的結果集(屬於Hibernate的功能)
17.1.12綁定參數
17.1.13設定查詢附屬事項
17.1.14定義命名查詢語句
17.1.15調用函式
17.1.16元模型類(MetaModel Class)
17.2設定查詢條件
17.2.1比較運算
17.2.2範圍運算
17.2.3字元串模式匹配
17.2.4邏輯運算
17.2.5集合運算
17.2.6case when語句
17.3小結
17.4思考題
第18章檢索數據API(下)
18.1連線查詢
18.1.1默認情況下關聯級別的運行時檢索策略
18.1.2立即左外連線
18.1.3左外連線
18.1.4立即內連線
18.1.5內連線
18.1.6立即右外連線
18.1.7右外連線
18.1.8交叉連線
18.1.9隱式連線
18.1.10關聯級別運行時的檢索策略
18.1.11用Tuple包裝查詢結果
18.2投影查詢
18.2.1用JavaBean包裝查詢結果
18.2.2過濾查詢結果中的重複元素
18.3報表查詢
18.3.1使用聚集函式
18.3.2分組查詢
18.3.3最佳化報表查詢的性能
18.4高級查詢技巧
18.4.1動態查詢
18.4.2集合過濾
18.4.3子查詢
18.4.4本地SQL查詢
18.5查詢性能最佳化
18.5.1Hibernate API中Query接口的iterate()方法
18.5.2Hibernate的查詢快取
18.6小結
18.7思考題
第19章Hibernate高級配置
19.1配置資料庫連線池
19.1.1使用默認的資料庫連線池
19.1.2使用配置檔案指定的資料庫連線池
19.1.3從容器中獲得數據源
19.1.4由Java套用本身提供資料庫連線
19.2配置事務類型
19.3把SessionFactory與JNDI綁定
19.4配置JNDI
19.5配置日誌
19.6使用XML格式的配置檔案
19.7小結
19.8思考題
第20章聲明資料庫事務
20.1資料庫事務的概念
20.2聲明事務邊界的方式
20.3在mysql.exe客戶程式中聲明事務
20.4Java套用通過JDBC API聲明JDBC事務
20.5Java套用通過Hibernate API聲明JDBC事務
20.5.1處理異常
20.5.2Session與事務的關係
20.5.3設定事務逾時
20.6Java套用通過Hibernate API聲明JTA事務
20.7Java套用通過JTA API聲明JTA事務
20.8小結
20.9思考題
第21章處理並發問題
21.1多個事務並發運行時的並發問題
21.1.1第一類丟失更新
21.1.2髒讀
21.1.3虛讀
21.1.4不可重複讀
21.1.5第二類丟失更新
21.2資料庫系統的鎖的基本原理
21.2.1鎖的多粒度性及自動鎖升級
21.2.2鎖的類型和兼容性
21.2.3死鎖及其防止辦法
21.3資料庫的事務隔離級別
21.3.1在mysql.exe程式中設定隔離級別
21.3.2在應用程式中設定隔離級別
21.4在應用程式中採用悲觀鎖
21.4.1利用資料庫系統的獨占鎖來實現悲觀鎖
21.4.2由應用程式實現悲觀鎖
21.5利用版本控制來實現樂觀鎖
21.5.1使用整數類型的版本控制屬性
21.5.2使用時間戳類型的版本控制屬性
21.5.3為持久化對象設定鎖
21.5.4強制更新版本
21.6實現樂觀鎖的其他方法
21.7小結
21.8思考題
第22章管理Hibernate的快取
22.1快取的基本原理
22.1.1持久化層的快取的範圍
22.1.2持久化層的快取的並發訪問策略
22.2Hibernate的二級快取結構
22.3管理Hibernate的第一級快取
22.4管理Hibernate的第二級快取
22.4.1獲得EHCache快取外掛程式的類庫
22.4.2在persistence.xml檔案中配置第二級快取
22.4.3在持久化類中啟用實體數據快取、自然主鍵快取和集合快取
22.4.4設定EHCache的ehcache.xml配置檔案
22.4.5獲取第二級快取的統計信息
22.4.6設定第二級快取的讀寫模式
22.4.7在程式中控制第二級快取
22.4.8查詢快取
22.5小結
22.6思考題
第23章管理Session和實現對話
23.1管理Session對象的生命周期
23.1.1Session對象的生命周期與本地執行緒綁定
23.1.2Session對象的生命周期與JTA事務綁定
23.2實現對話
23.2.1使用游離對象
23.2.2使用手動清理快取模式下的Session
23.2.3通過JPA API來實現對話
23.3小結
23.4思考題
第24章Spring、JPA與Hibernate整合
24.1本章範例所涉及軟體的Java類庫
24.2設定Spring的配置檔案
24.3編寫本章範例的Java類
24.3.1編寫Customer實體類
24.3.2編寫CustomerDao數據訪問接口和類
24.3.3編寫CustomerService業務邏輯服務接口和類
24.3.4編寫測試類Tester
24.4小結
第25章運用Spring和Hibernate創建購物網站
25.1實現業務數據
25.2實現業務邏輯
25.3控制層訪問模型層
25.4netstore套用的訂單業務
25.5小結
附錄A標準SQL語言的用法
A.1數據完整性
A.1.1實體完整性
A.1.2域完整性
A.1.3參照完整性
A.2DDL數據定義語言
A.3DML數據操縱語言
A.4DQL數據查詢語言
A.4.1簡單查詢
A.4.2連線查詢
A.4.3子查詢
A.4.4聯合查詢
A.4.5報表查詢
附錄BJava語言的反射機制
附錄C發布和運行netstore套用
附錄D思考題答案
附錄E書中涉及軟體獲取途徑
出版背景
本書把JPA與Hibernate結合在一起介紹,是實用的Java持久化層的開發參考書籍。
作者簡介
孫衛琴,知名IT作家和Java專家,畢業於上海交通大學,隨後主要從事軟體開發工作,擅長Java軟體研發和架構設計,還從事Java方面的培訓和諮詢工作。2002年開始Java技術領域的創作,文風清晰嚴謹、深入淺出,深受讀者歡迎,其多部作品在同類書籍中位居全國暢銷排行榜的榜首。