1. 程式人生 > >hibernate基礎(三)——主鍵生成策略與flush快取清理

hibernate基礎(三)——主鍵生成策略與flush快取清理

    在瞭解此文前,請首先閱讀:
    在使用hibernate時,我們還是很有必要將hibernate的內部實現原理來搞清楚一下的。比如,hibernate在儲存一個物件時,
    它的內部實現原理是怎樣的。當然要想清楚的瞭解這些,就必須要從它的主鍵生成策略出發來一步一步深入探究!

一、儲存物件簡單原理

在通過hibernate來儲存一個物件時,要先了解它內部的原理:

1、save

此方法在執行時,會先把一個物件放在session快取中

(當然可以巨集觀上先這麼理解,會有意外,這個意外也是這篇部落格介紹的重點)

於此同時,在快取中還會再生成一個臨時物件的快取區,在這塊臨時區域中會在進行資料庫操作時,與session中的物件進行對比,最後 生成sql語句。
(在session快取區中會有一個isDatabase這個標識來標記當前資料是否已經存在資料庫中)

2、commit

    預設在執行完save之後,資料其實並沒有真正的到達資料庫(有意外),通常在執行完commit之後,才會是真正意義上的物件儲存。
    但是預設情況下,在執行commit之前,hibernate會自動先執

flush方法,此方法用來根據臨時物件快取區生成sql語句,操作資料庫

    並清理session快取區。完成真正的資料插入操作。

二、主鍵生成策略

    這裡並不是想一一介紹主鍵有哪些生成策略,而是想簡單的瞭解一下主鍵的生成方式都是由什麼來決定的,會造成什麼影響。

1、uuid

    主要是通過hibernate生成,效率較高。所以此中方式儲存物件時,在執行完save後,就會為物件的主鍵進行賦值。
    只有在執行完commit或者顯式執行flush之後才會生成sql並清理快取,形成真正意義上的資料儲存

2、native(下面就是意外)

    通過不同資料庫的能力來生成主鍵。所以效率相對較差。
在執行完save方法之後,由於他要去資料庫中生成id,所以此時會直接生成sql並清理快取。如果你的資料庫隔離級別設定為不提交讀時,
在未執行完commit方法之前就可以從資料庫中查到資料了。

3、assigned

    此種方式一種會涉及到

三、顯式呼叫flush方法

    上面說了hibernate中在執行commit時,會預設先執行flush,似乎平時用不到顯式呼叫,那麼什麼時候才會用到flush的顯式呼叫呢?

1、evict方法

    此方法是用來清理session快取區的。
    當我們在程式中呼叫save方法後,有時需要呼叫evict方法來清理session快取區。但此時再執行commit方法時,hibernate會報執行緒
不安全的錯誤。
首先分析下原因:

正常情況下:

    save之後,執行commit時,先執行flush方法,根據臨時物件區域生成sql語句,然後清理掉臨時物件區域,
會返回到session中修改isDatabase標記,修改完成後再清理session快取區。

save之後執行evict情況

    此時,剛執行完save後,就執行evict方法,會先清理session快取,也就是說isDatabase標記已經不存在了,那麼當再執行commit時,
預設先執行flush方法時,會去修改session快取區中的isDatabase標記,此時,標記找不到,因此會報錯。

解決方案

    我們可以通過在save方法執行完成之後,顯式執行flush方法,此時,會先進行資料真實儲存,再清理session,這樣就不會再報錯了。

2、assigned手動分配與業務邏輯相結合

    如果主鍵配置為assigned,那麼在業務邏輯中如果出現需要按順序執行insert,update,insert這三個語句時,我們發現在commit之後,
hibernate生成語句的順序為:insert,insert,update
那麼此時,就與我們的設想偏離,若想按照原來的順序執行,此時就可以通過顯式執行flush方法來先將前兩個語句進行執行,再去執行最後一個語句。

總結

主鍵的生成與hibernate的實現原理息息相關。同時flush方法的使用也對具體的程式開發起到很重要的作用。同時瞭解hibernate
中具體操作的實現原理對於理解hibernate和程式開發中的優化也有很大的幫助

相關推薦

hibernate基礎——生成策略flush快取清理

在瞭解此文前,請首先閱讀: 在使用hibernate時,我們還是很有必要將hibernate的內部實現原理來搞清楚一下的。比如,hibernate在儲存一個物件時, 它的

Hibernate 生成方式

參考文獻: http://blog.csdn.net/wanghuan203/article/details/7562395 http://www.cnblogs.com/hoobey/p/5508992.html 宣告:主鍵生成配置直接摘抄了http://www.cnbl

Hibernate】持久化類、生成策略和一級快取

1.2 持久化類的編寫規則 1.2.1 持久化類的概述 什麼是持久化類 持久化:將記憶體中的一個物件持久化到資料庫中過程。Hibernate框架就是用來進行持久化的框架。 持久化類:一個Java物件與資料庫的表建立了對映關係,那麼這個類在Hibernate中稱為是持久化類。

hibernate基礎

冗余 多對一 數據 保存 delete src delet save 這一 1.一對多|多對一   1)關系表達     1>表中的表達               2>orm元數據中表達       一對多:            多對一:        2)

Hibernate各種生成策略配置詳解

文檔 最簡 重啟 如果 自定義 早期 出錯 lsp 當地時間 1、assigned 主鍵由外部程序負責生成,在 save() 之前必須指定一個。Hibernate不負責維護主鍵生成。與Hibernate和底層數據庫都無關,可以跨數據庫。在存儲對象前,必須要使用主鍵的sett

C++ 基礎C++標頭檔案原始檔的使用方法 舉例

看完這篇文章,你就知道怎麼用標頭檔案和原始檔了 http://www.cnblogs.com/fenghuan/p/4794514.html 標頭檔案:常量、變數、函式、類的宣告 原始檔:變數的定義和函式的實現 步驟一、先建立標頭檔案 #ifndef CIRCLE_H #defi

hibernate註解(annoation)使用id生成策略

hibernate註解(annoation)使用id主鍵生成主要要使用到以下幾個註解: @Id,@GeneratedValue,@GenericGenerator. ,@GeneratedValue的作用是JPA的預設實現自定義主鍵生成策略,@GenericGener

Hibernate生成策略save()方法是否發sql語句的研究

    public class SessionFlushTest extends TestCase {              /**     * 測試uuid主鍵生成策略     */       public void testSave1() {        

Redis基礎Redis持久化:RDBAOF

什麼是Redis持久化? --- Redis是鍵值對的記憶體資料庫,它將資料儲存在記憶體裡。客戶端傳送命令到伺服器,再由伺服器到記憶體裡查詢資料。 ![image](https://yxl-article.oss-cn-shenzhen.aliyuncs.com/images/redis-basic/03

Hibernate 學習Hibernate生成策略

生成主鍵的幾種形式 通過JPA的策略生成器來進行生成:JPA hibernate 其他的ORM框架照樣支援 GenerationType.TABLE,SEQUENCE Hiberante : foriegn uuid 自定義主鍵生成方式 TABLE快取

hibernate 生成策略

hibernate的主鍵生成器: generator元素:表示了一個主鍵生成器,它用來為持久化類例項生成唯一的標識 主鍵生成器: 1、程式設計師自己控制 assigned 提示:如果hibernate設定了程式設計師自己控制資料庫主鍵設定了自動增長也不會成功

(轉 Hibernate持久化類生成策略

bject 規則 修飾符 cti arc arch 斷點 可能 策略 http://blog.csdn.net/yerenyuan_pku/article/details/65462930 Hibernate持久化類 什麽是持久化類呢?在Hibernate中持久化類的英

Java 持久化技術規範JPA 中的生成策略

簡介: Java Persistence API(JPA)中要求每個實體(Entity)類必須有一個主鍵,並且提供了 Table,Sequence,Identity,Auto 四種主鍵生成策略。其中 Identity 為表自動增長欄位;Sequence 通過序列產生主鍵;這兩

Hibernate 生成策略

關閉 min conn mine 數據 xml文件 ive orm 刪除 第一步:引入jar包 省略 第二部:創建實體類 package cn.hibernate.bean; public class Student { private Integer sId;

mysql基礎存儲引擎和鎖

mysql存儲引擎的概念: 關系型數據庫表是用於存儲和組織信息的數據結構,可以將表理解為由行和列組成的表格,各種各樣,不同的表結構意味著存儲不同類型的數據,在數據的處理上也會存在著差異,對於mysql來說,它提供了多種類型的存儲引擎,可以根據對數據處理的需求,選擇不同的存儲引擎,從而最大

python基礎----字符編碼以及文件處理

odin mod window 存儲空間 表示 一行 內存數據 rec 錯誤 字符編碼與文件處理 一.字符編碼 由字符翻譯成二進制數字的過程 字符--------(翻譯過程)------->數字 這個過程實際就是一個字符如何對應一個特定數字的標準,這個標準

Hibernate生成策略小總結

rem 時間值 多線程 class 判斷 acl 選擇 hiberna bsp 主鍵生成策略大致分兩種: 手工控制策略 自動生成策略【框架自動生成和數據庫自動生成】 手工控制策略: assigned:類型是任意的,需要在 save() 到數據庫前,編碼人員手工設置主鍵

Hibernate生成策略

要求 mage src ble 配置 生成策略 padding pac 之前 Hibernate主鍵生成策略 1 hibernate要求實體類裏面有一個屬性作為唯一值,對應表主鍵,主鍵可以不同生成策略 2 hibernate主鍵生成策略有很多的值 3 在cl

JS基礎語句

pre 對比 初始化 語句 for 如果 logs 如何 tin 一.判斷語句(PS:一般情況下判斷條件最終應該是一個布爾值。)   1.if語句     1)基本格式 if(判斷條件){ 如果判斷條件成立則執行的語句 }else{ 如果判斷條件不成立則執

java並發基礎

線程生命周期 over out 處理請求 生命 inter 方式 希望 stat 第6章開始是第二部分,講解結構化並發應用程序,大多數並發應用程序都是圍繞“任務執行”構造的,任務通常是一些抽象的且離散的工作單元。 一、線程池 大多數服務器應用程序都提供了一種自然的任務邊界: