精通 JPA 與 Hibernate:Java 對象持久化技術詳解 (微課視頻版)
內容描述
本書詳細介紹了運用JPA以及目前最成熟的Hibernate 5版本進行Java對象持久化的技術。通過本書,讀者不僅能掌握用JPA和Hibernate工具對這兩種模型進行映射的技術,還能獲得設計與開發Java對象模型和關系數據模型的先進經驗。本書將幫助讀者編寫出具有合理的軟件架構以及好的運行性能和並發性能的實用應用程序。書中內容註重理論與實踐相結合,列舉了大量具有典型性和實用價值的應用實例,並提供了詳細的開發和部署步驟。無論對於Java開發的新手還是行家來說,本書都是精通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書中涉及軟件獲取途徑
作者介紹
孫衛琴,知名IT作家和Java專家,畢業於上海交通大學,隨後主要從事基於Java的軟件開發工作,在此其間還從事Java方面的培訓和諮詢工作。
2002年開始Java技術領域的創作,文風清晰嚴謹、深入淺出,深受讀者歡迎,其多部作品的銷量在同類書籍中經常位居全國榜首。