Hibernate框架進階

小花貓Jane發表於2017-12-15

hibernate原理為主。主要內容包括:

一、
hibernate中的實體建立規則

二、
hibernate主鍵生成策略(7種)

三、
hibernate物件的三種狀態

四、
hibernate中的快取

五、事務管理

六、
Hibernate支援的三種資料庫操作語法:HQL、Criteria、SQL

一、hibernate中的實體建立規則

hibernate中的實體類是需要與資料庫中的表格進行建立對映關係的,所以我們在建立實體類時需要注意一些規則,如果你的實體類不符合這些規則可能就會無法對映成功。

1)

持久化類提供無參建構函式

  一般如果沒有建立有參建構函式,預設就可以了。

2)

成員變數私有,提供共有的
get/set方法訪問。需提供屬性。

3)

持久化類的屬性,應儘量適用封裝資料型別。

  即資料型別是
int儘量替換成Integer型別,long型別使用Long型別代替,依次類推。這樣適用的好處是Integer、Long等這些封裝型資料型別可以傳入null值,而基本資料型別不能傳入null。

4)

持久化類需要提供
oid,與資料庫中的主鍵列對應。(即表格必須要有主鍵)

5)class之前不能使用final來修飾。

  這是由於
final修飾的類不能被繼承,而hibernate框架會使用cglib代理生成代理物件,而被代理物件的建立是通過繼承來實現的。

二、hibernate主鍵生成策略(7種)

主鍵就是唯一存在能代表這條資料唯一性的欄位或欄位組合。就像你的身份證一樣獨一無二。上面的規則中說了在
hibernate中的表必須指明主鍵,一般主鍵分為自然主鍵和代理主鍵,就像你的指紋是天生的,但又可以代表你這個人,這就是自然主鍵,而身份證是後天專門設計,這種主鍵就是代理主鍵。實際專案中,我們幾乎都是使用代理主鍵,即自己設計的主鍵作為表中每一條資料的主鍵。在我們的資料庫中也會為你自動生成主鍵,比如主鍵自增,這就是要下面要講的主鍵生成策略之一,在hibernate中有7種主鍵生成策略。其實大部分我們不會使用到,所以除了幾個常用的,其他作為了解即可。

1)identity(sql使用) : 主鍵自增。由MySQL資料庫來維護主鍵值。錄入時不需要指定主鍵。

2)sequence(Oracle使用):Oracle資料庫中的主鍵生成策略。

3)increment(瞭解)::主鍵自增。由hibernate來維護。每次插入前會先查詢表中id最大值。+1作為新主鍵值。(其實存在併發問題)

4)hilo(瞭解): 高低位演算法。主鍵自增。由hibernate來維護。開發時不使用。

5)native(推薦):hilo+sequence+identity ,自動三選一策略。

6)uuid:產生隨機字串作為主鍵。主鍵型別必須為String 型別。

7)assigned:自然主鍵生成策略。hibernate不會管理主鍵值,由開發人員自己錄入,若忘記手動錄入會發生異常。

三、hibernate物件的三種狀態

Hibernate框架中,會將實體對像分為三種狀態,分別為:瞬時狀態、持久化狀態和遊離狀態。當物件在持久化下,對物件進行操作就會將變化同步到資料庫中,所以叫持久化狀態。

1、每種狀態都有不同的標誌:

瞬時狀態:該物件沒有
id,或說id=null。即該物件主鍵尚未賦值。

持久化狀態:該物件主鍵已經賦值,且與處於
session繫結狀態。

遊離狀態:該物件主鍵已經賦值,但沒有雨
session進行繫結。

四、事務管理

1、事務(Transaction)

事務,一般是指要做的或所做的事情。在計算機術語中是指訪問並可能更新資料庫中各種資料項的一個程式執行單元
(unit)。

1.1事務的特性:

1)原子性:說的是在一個事務內是不可分割的,要麼成功,要麼失敗。

2)一致性:可以理解為事務的前後資料的變化的一致性,例如把張三給李四轉賬500元看做一個事務,在這個事務結束後,張三的錢少了500那麼李四的錢必然增加500。

3)隔離性:是指事務之間互不干擾和影響,即併發執行事務時應當按照是連續地執行、互不干擾地執行(一個接一個)。(資料庫的隔離級別的設定會導致不同的隔離性,看下文)

4)永續性:簡單說就是事務一旦執行成功就持久化到資料庫中。

1.2事務的隔離級別:

事務的隔離級別從低到高有:(不同的隔離級別涉及不同的併發訪問問題)

Read Uncommitted(讀未提交)
:最低的隔離級別,什麼都不需要做,一個事務可以讀到另一個事務未提交的結果。所有的併發事務問題都可能會發生。

Read Committed(讀已提交)
:只有在事務提交後,其更新結果才會被其他事務看見。可以解決髒讀問題。

Repeated Read(可重複讀)(MySQL預設級別)
:在一個事務中,對於同一份資料的讀取結果總是相同的,無論是否有其他事務對這份資料進行操作,以及這個事務是否提交。可以解決髒讀、不可重複讀。

Serialization(序列化)
:理想的真正的事務隔離性,事務序列化執行,隔離級別最高,犧牲了系統的併發性。可以解決併發事務的所有問題。

1.3隔離性級別導致的併發訪問問題:

上面說到的隔離級別處理
Serialization(序列化)
都存在併發訪問問題,但序列化是不允許併發訪問的(這樣做雖然安全,但效率也極低),所以我們一般不採用。

1)

髒讀
(Drity Read)
:事務
A修改了一個資料,但未提交,事務B讀到了事務A
未提交
的更新結果,如果事務
A提交失敗,事務B讀到的就是髒資料。

2)

不可重複讀
(Non-repeatable read) : 在同一個事務中,對於同一份資料讀取到的結果不一致。比如,事務B在事務A提交前讀到的結果,和提交後讀到的結果可能不同。不可重複讀出現的原因就是
事務併發修改記錄
,要避免這種情況,最簡單的方法就是對要修改的記錄
加鎖,這導致鎖競爭加劇,影響效能。

3)

幻讀(虛讀)
(Phantom Read) : 在同一個事務中,同一個查詢多次返回的結果不一致。事務A新增了一條記錄,事務B在事務A提交前後各執行了一次查詢操作,發現後一次比前一次多了一條記錄。幻讀僅指由於併發事務增加記錄導致的問題,這個不能像不可重複讀通過記錄加鎖解決,因為對於新增的記錄根本無法加鎖。需要將事務序列化,才能避免幻讀。

想要學習前端開發的同學,可以加群:
543627393
學習哦!


相關文章