1. 程式人生 > >學習Hibernate框架-第2天

學習Hibernate框架-第2天

持久化類的編寫規則

一、持久化類的概述

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);

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)(清空某一個);

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);

三、持久態物件特性

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的語法極其類似,是面向物件的查詢語言。
      在這裡插入圖片描述

2、Criteria

  • Creteria : QBC(Query By Criteria)
    • 更加面向物件的一種查詢方式。
      在這裡插入圖片描述

3、SQLQuery

  • SQLQuery用於接收SQL。在sql語句特別複雜的時候使用SQLQuery,否則一般情況下使用前兩種方法就可以了。