1. 程式人生 > >Hibernate持久化類詳解

Hibernate持久化類詳解

2 Hibernate持久化類詳解


上接Hibernate入門學習:https://blog.csdn.net/biggerchong/article/details/84229658 

目錄

2 Hibernate持久化類詳解

2.1持久化類的編寫規則

2.2主鍵生成策略

2.2.1主鍵的分類

2.2.2 hibernate中主鍵生成策略

2.2.3 持久類物件3種狀態

2.2.4 Hibernate一級快取

2.2.5 Hibernate事務管理

2.3Hibernate的其他API

2.3.1 Query

2.3.2 Criteria

2.3.3 SQLQuery


 

2.1持久化類的編寫規則

  1. 對持久化類提供一個無引數的構造方法:

                     Hibernate底層需要使用反射生成例項

  1. 屬性需要私有,對私有屬性提供public的get/set方法:

                     Hibernate中獲取設定物件的值

  1. 對持久化類提供一個唯一標識OID(Object Identifier,物件識別符號又稱為物聯網域名)與資料庫主鍵對應:

                   Java中通過物件的地址區分是否是同一個物件,資料庫中通過主鍵確定是否是同一個記錄,在Hibernate中通過持久化類的OID的屬性區分是否是同一個物件。

  1. 持久化類中的屬性儘量使用包裝類型別:

                   

對應資料庫中的NULL

  1. 持久化類不要使用final進行修飾:

                   Hibernate中的延遲載入是其優化手段,返回的是一個代理物件,如果不能被繼承將變的毫無意義。


 

2.2主鍵生成策略

2.2.1主鍵的分類

         自然主鍵:主鍵的本身是表中必須的一個欄位(實體中的一個具體的屬性)

         代理主鍵:主鍵的本身不是表中必須的欄位(不是實體中某個具體的屬性)

在實際開發中儘量使用代理主鍵:

  1. 一旦有自然主鍵參與到業務邏輯中,後期修改維護難度大大提升
  2. 好的程式設計滿足OCP原則:對程式的擴充套件是open的,對程式的修改是close

 

2.2.2 hibernate中主鍵生成策略

在實際開發中一般不允許使用者手動設定主鍵,一般將主鍵交給資料庫,手動編寫程式進行設定。在Hibernate中微量減少程式編寫提供了很多種的主鍵成成策略。

  1. incrementHibernate中提供的自動增長機制,適用short、int、long型別的主鍵,單執行緒中使用
  2. identity適用以上三種類型的主鍵,使用資料庫底層自動增強機制。適用於有自動增強機制資料庫(MYSQL、                                   MSSQL),Oralce不適用
  3. sequence適用以上三種類型主鍵,採用序列的方式,支援Oracle。(MYSQL、MSSQL不支援)
  4. uuid適用於字串型別的主鍵,使用hibernate中的隨機方式生成字串主鍵
  5. native本地策略,可以根據資料庫自動在identity、sequence間切換
  6. assignedHibernate放棄主鍵的管理,需要手動表寫程式或者使用者自己設定
  7. 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一級快取機制的存在。

   獲得:

  1. session.get(Customer.class,id);
  2. session.load(Customer.class,id);
  3. session.find(..);
  4. 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事務管理

事務:事務指的是邏輯上的一組操作,做成這組操作的各個邏輯單元要麼全都成功,要麼     全都失敗。

 

事務特性:

  1. 原子性:代表事務不可分割
  2. 一致性:代表事務執行前後,資料的完整性保持一致
  3. 隔離性:代表一個事務執行的過程中,不會受到其他事務的干擾
  4. 永續性:代表事務執行完畢後,資料就會持久到資料庫中

    如果不考慮隔離性將會產生的安全性問題?

             讀問題:

                 髒讀:一個事務讀到另一個為提交的資料。

                 不可重複讀: 個事務讀到領一個事務已經提交的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

CriteriaQBC( Query By Criteria ),更加面向物件的一種查詢方式。

2.3.3 SQLQuery

SQLQuery用於接收SQL語句,是在SQL查詢特別複雜的情況下使用SQL。


下接Hibernate關聯對映(一對多/多對多):https://blog.csdn.net/biggerchong/article/details/84340105

                                                                                  -----謝謝閱讀!                             ---------知飛翀