Hibernate持久化類詳解
2 Hibernate持久化類詳解
上接Hibernate入門學習:https://blog.csdn.net/biggerchong/article/details/84229658
目錄
2.1持久化類的編寫規則
- 對持久化類提供一個無引數的構造方法:
Hibernate底層需要使用反射生成例項
- 屬性需要私有,對私有屬性提供public的get/set方法:
Hibernate中獲取設定物件的值
- 對持久化類提供一個唯一標識OID(Object Identifier,物件識別符號又稱為物聯網域名)與資料庫主鍵對應:
Java中通過物件的地址區分是否是同一個物件,資料庫中通過主鍵確定是否是同一個記錄,在Hibernate中通過持久化類的OID的屬性區分是否是同一個物件。
- 持久化類中的屬性儘量使用包裝類型別:
- 持久化類不要使用final進行修飾:
Hibernate中的延遲載入是其優化手段,返回的是一個代理物件,如果不能被繼承將變的毫無意義。
2.2主鍵生成策略
2.2.1主鍵的分類
自然主鍵:主鍵的本身是表中必須的一個欄位(實體中的一個具體的屬性)
代理主鍵:主鍵的本身不是表中必須的欄位(不是實體中某個具體的屬性)
在實際開發中儘量使用代理主鍵:
- 一旦有自然主鍵參與到業務邏輯中,後期修改維護難度大大提升
- 好的程式設計滿足OCP原則:對程式的擴充套件是open的,對程式的修改是close的
2.2.2 hibernate中主鍵生成策略
在實際開發中一般不允許使用者手動設定主鍵,一般將主鍵交給資料庫,手動編寫程式進行設定。在Hibernate中微量減少程式編寫提供了很多種的主鍵成成策略。
- increment:Hibernate中提供的自動增長機制,適用short、int、long型別的主鍵,單執行緒中使用
- identity:適用以上三種類型的主鍵,使用資料庫底層自動增強機制。適用於有自動增強機制資料庫(MYSQL、 MSSQL),Oralce不適用
- sequence:適用以上三種類型主鍵,採用序列的方式,支援Oracle。(MYSQL、MSSQL不支援)
- uuid:適用於字串型別的主鍵,使用hibernate中的隨機方式生成字串主鍵
- native:本地策略,可以根據資料庫自動在identity、sequence間切換
- assigned:Hibernate放棄主鍵的管理,需要手動表寫程式或者使用者自己設定
- foreign:外部的一對一的一種關聯對映情況下使用。(瞭解)
2.2.3 持久類物件3種狀態
瞬時態物件:沒有OID標識,不被session管理
獲得:
Customer customer = new Customer( );
狀態轉換:
瞬時—>持久
save(Object o)、saveOrUpdate(Object o)
瞬時—>脫管
customer.setCstr_id(Long long);
持久態物件:有OID標識,被session管理; 持久態物件具有自動更新資料庫的功能,不用額外session.update( );這是因為Hibernate一級快取機制的存在。
獲得:
- session.get(Customer.class,id);
- session.load(Customer.class,id);
- session.find(..);
- session.Iterate(..);
狀態轉換:
持久—>瞬時
session.delete(..)
持久—>脫管
session.close(); clear(); evict(Object o);
脫管態物件:有OID標識,不被session管理
獲得:
Customer customer = new Customer( );
Customer.setCstr_id(Long long);
狀態轉換:
脫管—>持久
update(Object o)、saveOrUpdate(Object o)
脫管—> 瞬時
customer.setCstr_id(null);
2.2.4 Hibernate一級快取
2.2.5 Hibernate事務管理
事務:事務指的是邏輯上的一組操作,做成這組操作的各個邏輯單元要麼全都成功,要麼 全都失敗。
事務特性:
- 原子性:代表事務不可分割
- 一致性:代表事務執行前後,資料的完整性保持一致
- 隔離性:代表一個事務執行的過程中,不會受到其他事務的干擾
- 永續性:代表事務執行完畢後,資料就會持久到資料庫中
如果不考慮隔離性將會產生的安全性問題?
讀問題:
髒讀:一個事務讀到另一個為提交的資料。
不可重複讀: 一個事務讀到領一個事務已經提交的update資料,導致前一個事務多次查詢結果不一致。
虛讀: 一個事務讀到另一個事務已經提交的insert資料,導致前一個事務多次查新結果不一致。
寫問題(瞭解): 引發兩類丟失更新
讀問題的解決:
設定事務的隔離級別(紅色為重點):
Read uncommitted: 以上讀問題都會發生
Read committed: 解決髒讀,但是不可重複讀和虛讀有可能發生
Repeatable read: 解決髒讀和不可重複讀,但是虛讀有可能發生
Serializable:解決所有讀問題,但是耗資源耗時(不推薦)
Hibernate中設定事務隔離級別:
<property name=”hibernate.connection.isolation”>4</property>
2.3Hibernate的其他API
自定義封裝的Session工具類
2.3.1 Query
Query介面用於接收HQL(Hibernate Query language),HQL是Hibernate查詢語言,與SQL語言類似,是一種面向物件的查詢語言。
2.3.2 Criteria
Criteria:QBC( Query By Criteria ),更加面向物件的一種查詢方式。
2.3.3 SQLQuery
SQLQuery用於接收SQL語句,是在SQL查詢特別複雜的情況下使用SQL。
下接Hibernate關聯對映(一對多/多對多):https://blog.csdn.net/biggerchong/article/details/84340105
-----謝謝閱讀! ---------知飛翀