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持久化:RDB與AOF
什麼是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章開始是第二部分,講解結構化並發應用程序,大多數並發應用程序都是圍繞“任務執行”構造的,任務通常是一些抽象的且離散的工作單元。 一、線程池 大多數服務器應用程序都提供了一種自然的任務邊界: