學習Hibernate框架-第2天
阿新 • • 發佈:2018-12-21
持久化類的編寫規則
一、持久化類的概述
1、什麼是持久化類
- 持久化:將記憶體中的一個物件持久化到資料庫中的過程。Hibernate框架就是用來進行持久化的框架。
- 持久化類:一個Java物件與資料庫中的表建立了對映關係,那麼這個類在Hibernate中被稱為是持久化類。
- 持久化類 = Java類 + 對映檔案。
二、持久化類的編寫規則
1、持久化類的編寫規則
- 對持久化類提供一個無引數的構造方法 : Hibernate底層需要使用反射生成例項。
- 屬性需要私有,對私有屬性提供public的get和set方法 : Hibernate中獲取,設定物件的值。
- 對持久化類提供一個唯一識別符號OID與資料庫主鍵對應 : Java中通過物件的地區是否是同一個物件,資料庫中通過主鍵確定是否是同一個記錄,在Hibernate中通過持久化類的OID的屬性區分是否是同一個物件。
- 持久化類中的屬性儘量使用包裝類型別(Integer,Long,Double等):因為基本資料型別預設是0,那麼0就會有很多歧義。包裝類型別預設值是null。
- 持久化類不要使用final進行修飾 :延遲載入本身是Hibernate的一個優化手段,返回的是一個代理物件(javassist可以對沒有實現介面的類產生代理——使用了非常底層的位元組碼增強技術,繼承這個類進行代理)。如果不能被繼承,不能產生代理物件,延遲載入也就失效了。此時,load方法與get方法一致。
主鍵生成策略
一、主鍵的分類
1、自然主鍵
- 自然主鍵 : 主鍵的本身就是表中的一個欄位(實體中的一個具體的屬性)。
- 建立一個人員表,每個人員都會有一個身份證號(唯一的不可重複的),使用了身份證號作為主鍵,這種主鍵稱為是自然主鍵。
2、代理主鍵
持久化類的三種狀態
一、持久化類的三種狀態
Hibernate是持久層框架,通過持久化類完成ORM操作。Hibernate為了更好的管理持久化類,將持久化類分成三種狀態。
1、 瞬時態:transient
- 這種物件沒有唯一的標識OID,沒有被session管理,稱為瞬時態物件。
2、 持久態:persistent
- 這種物件有唯一標識OID,被session管理,稱為持久態。
- 持久化類的持久態物件,可以自動更細你資料庫。
3、 脫管態(遊離態):detached
- 這種物件有唯一標識OID,但是沒有被session管理,稱為脫管態物件。
4、區分三種狀態物件:
二、持久化類的狀態轉換(瞭解)
1、三種狀態轉換圖
2、瞬時態物件
- 瞬時態物件
- 獲得:直接建立即可,new一個
- Customer customer = new Customer();
- 狀態轉換:
- 瞬時–>持久:呼叫session的save、saveOrUpdate方法
- save(Object obj)、saveOrUpdate(Object obj);
- 瞬時–>脫管:給建立的物件設定一個id
- customer.setCust_id(1l);
- 瞬時–>持久:呼叫session的save、saveOrUpdate方法
- 獲得:直接建立即可,new一個
3、持久態物件
- 持久態物件
- 獲得:呼叫session的get、load、find、iterate方法即可
- get()、load()、find()、iterate()
- Customer customer = session.get(Customer.class,1l);
- 狀態轉換
- 持久–>瞬時:呼叫session的delete方法
- delete();
- 持久–>脫管:呼叫session的close、clear、evict方法
- close()、clear()(清空所有)、evict(Obeject obj)(清空某一個);
- 持久–>瞬時:呼叫session的delete方法
- 獲得:呼叫session的get、load、find、iterate方法即可
4、託管態物件
- 脫管態物件
- 獲得:沒有直接獲得的辦法,但可以建立完之後設定一個id
- Customer customer = new Customer();
- customer.setCust_id(1l);
- 狀態轉換
- 脫管–>持久:呼叫session的update、saveOrUpdate方法
- update(Object obj)、saveOrUpdate(Object obj);
- 脫管–>瞬時:將id設定為null即可
- customer.setCust_id(null);
- 脫管–>持久:呼叫session的update、saveOrUpdate方法
- 獲得:沒有直接獲得的辦法,但可以建立完之後設定一個id
三、持久態物件特性
1、持久化類持久態物件自動更新資料庫
當設定的名字和原來的一樣的時候,只進行查詢,不進行更新,很智慧。
原理:依賴了hibernate的一級快取。
Hibernate的一級快取
一、快取的概述
1、什麼是快取
快取:是一種優化的方式,將資料存入到記憶體中,使用的時候直接從快取中獲取,不用通過儲存源。
二、Hibernate的快取
1、Hibernate的一級快取
Hibernate框架中提供了多種多樣的優化手段:快取、抓取策略。
Hiernate中提供了兩種快取機制:
- 一級快取
- Hibernate的一級快取稱為是Session級別的快取,以及快取生命週期與session一致。即如果session建立了,則以及快取也就存在了,session如果被銷燬,那麼一級快取也就沒有了,因為一級快取是由session中的一系列Java集合構成的。
- 一級快取是自帶的不可解除安裝的。
- 二級快取
- Hibernate二級快取是SessionFactory級別的快取,需要配置的快取,也就是說,二級快取預設是不開啟的,如果要使用二級快取,則需要你自己去進行配置。
- 現在企業中一般很少用二級快取,基本上不用,替代的是redis。
2、證明一級快取的存在
三、Hibernate的一級快取的內部結構
1、一級快取中的特殊區域:快照區
Hibernate的事務管理
一、事務的回顧
1、什麼是事務
- 事務:事務指的是邏輯上的一組操作,組成這組操作的各個邏輯單元要麼全部成功,要麼全部失敗。
2、事務特性
- 原子性:代表事務不可分割;
- 一致性:代表事務執行的前後,資料的完整性保持一致;
- 隔離性:代表一個事務執行的過程中,不應該受到其他事務的干擾;
- 永續性:代表事務執行完成後,資料就持久到資料庫中。
3、如果不考慮隔離性,則會引發安全性問題
- 讀問題
- 髒讀:一個事務讀到另一個事務未提交的資料;
- 不可重複讀:一個事務讀到另一個事務已經提交的update資料,導致在前一個事務多次查詢結果不一致;
- 虛讀:一個事務讀到另一個事務已經提交的insert資料,導致在前一個事務多次查詢結果不一致。
- 寫問題(瞭解)
- 引發兩類丟失更新
4、讀問題的解決
- 設定事務的隔離級別
- Read uncommitted : 以上讀問題都會發生;
- Read committed : 解決髒讀,但是不可重複讀和虛讀有可能發生;(Oracle採用)
- Repeatable read : 解決髒讀和不可重複讀,但是虛讀有可能發生;(MySQL採用)
- Serializable : 解決所有讀問題,不能有事務的併發。(效率最低,安全性最高,故基本不用)
二、Hibernate中設定事務隔離級別
1、Hibernate中設定事務的隔離級別
- 1 --Read uncommitted : 以上讀問題都會發生;
- 2 --Read committed : 解決髒讀,但是不可重複讀和虛讀有可能發生;(Oracle採用)
- 4 --Repeatable read : 解決髒讀和不可重複讀,但是虛讀有可能發生;(MySQL採用)
- 8 --Serializable : 解決所有讀問題。(效率最高,安全性最低,故基本不用)
三、Service層事務
1、Hibernate解決Service的事務管理
-
改寫工具類
-
配置完成
Hibernate的其他API
一、Hibernate的其他API
1、Query
- Query藉口給使用者接受HQL,查詢多個物件;
- HQL: Hibernate Query Language Hibernate查詢語言,這種語言與SQL的語法極其類似,是面向物件的查詢語言。
- HQL: Hibernate Query Language Hibernate查詢語言,這種語言與SQL的語法極其類似,是面向物件的查詢語言。
2、Criteria
- Creteria : QBC(Query By Criteria)
- 更加面向物件的一種查詢方式。
- 更加面向物件的一種查詢方式。
3、SQLQuery
- SQLQuery用於接收SQL。在sql語句特別複雜的時候使用SQLQuery,否則一般情況下使用前兩種方法就可以了。