1. 程式人生 > >Hibernate的clear(),flush(),evict()方法詳解

Hibernate的clear(),flush(),evict()方法詳解

session.evict(obj) :會把指定的緩衝物件進行清除。   session.clear() :把緩衝區內的全部物件清除,但不包括操作中的物件。   Hibernate 執行的順序如下:  (1) 生成一個事務的物件,並標記當前的 Session 處於事務狀態(注:此時並未啟動資料庫級事務)。  (2) 應用使用 s.save 儲存物件,這個時候 Session 將這個物件放入 entityEntries ,用來標記物件已經和當前的會話建立了關聯,由於應用對物件做了儲存的操作, Session 還要在 insertions 中登記應用的這個插入行為(行為包括:物件引用、物件
id Session 、持久化處理類)。  (3)s.evict 將物件從 s 會話中拆離,這時 s 會從 entityEntries 中將這個物件移出。  (4) 事務提交,需要將所有快取 flush 入資料庫, Session 啟動一個事務,並按照 insert,update,……,delete 的順序提交所有之前登記的操作(注意:所有 insert 執行完畢後才會執行 update ,這裡的特殊處理也可能會將你的程式搞得一團糟,如需要控制操作的執行順序,要善於使用 flush ),現在物件不在 entityEntries 中,但在執行 insert 的行為時只需要訪問 insertions
就足夠了,所以此時不會有任何的異常。異常出現在插入後通知 Session 該物件已經插入完畢這個步驟上,這個步驟中需要將 entityEntries 中物件的 existsInDatabase 標誌置為 true ,由於物件並不存在於 entityEntries 中,此時 Hibernate 就認為 insertions entityEntries 可能因為執行緒安全的問題產生了不同步(也不知道 Hibernate 的開發者是否考慮到例子中的處理方式,如果沒有的話,這也許算是一個 bug 吧),於是一個 net.sf.hibernate.AssertionFailure 就被丟擲,程式終止。
一般我們會錯誤的認為 s.save 會立即執行,而將物件過早的與 Session 拆離,造成了 Session insertions entityEntries 中內容的不同步。所以我們在做此類操作時一定要清楚 Hibernate 什麼時候會將資料 flush 入資料庫,在未 flush 之前不要將已進行操作的物件從 Session 上拆離。解決辦法是在 save 之後,新增 session.flush

相關推薦

Hibernate的clear flush evict 方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Hibernate的clear(),flush(),evict()方法

session.evict(obj) :會把指定的緩衝物件進行清除。   session.clear() :把緩衝區內的全部物件清除,但不包括操作中的物件。   Hibernate 執行的順序如下:  (1) 生成一個事務的物件,並標記當前的 Session 處於事務狀態(注:此時並未啟動資料庫級事

$.ajax()方法

例如 lencod ace 包含 等等 json 返回 用戶名 代碼 jquery中的ajax方法參數總是記不住,這裏記錄一下。 1.url: 要求為String類型的參數,(默認為當前頁地址)發送請求的地址。 2.type: 要求為String類型的參數,請求方式(p

Python的反射機制、hasattr() getattr() setattr() 函數使用方法

對象 tee lin sel __main__ err ace traceback 一個 hasattr(object, name)判斷一個對象裏面是否有name屬性或者name方法,返回BOOL值,有name特性返回True, 否則返回False。需要註意的是name要用

php上傳文件大小限制的方法

mem 限制 upload 文件夾 tro 最大 指定 php上傳文件 配置 打開php.ini,首先找到file_uploads = on ;是否允許通過HTTP上傳文件的開關。默認為ON即是開upload_tmp_dir ;文件上傳至服務器上存儲臨時文件的地方,如果沒指

接口測試工具soapUI的安裝和使用方法

service 技術 key custom media 負載 bmp file text soapUI是一個開源測試工具,通過soap/http來檢查、調用、實現Web Service的功能/負載/符合性測試。 使用soapUI可以非常方便的實現接口的功能測試、穩

Arrays 類的 binarySearch() 數組查詢方法

strong object tro search mage bject 技術分享 eight 獲得 Arrays類的binarySearch()方法,可以使用二分搜索法來搜索指定的數組,以獲得指定對象。該方法返回要搜索元素的索引值。binarySearch()方法提供多種重

JavaScript中getBoundingClientRect()方法

script otto java chrome 頁面 支持 urn client fire getBoundingClientRect() 這個方法返回一個矩形對象,包含四個屬性:left、top、right和bottom。分別表示元素各邊與頁面上邊和左邊的距離。

C# Process.Start()方法

stat 字符串 檔案 atd 一個 用戶名 菜單 簡單介紹 run System.Diagnostics.Process.Start(); 能做什麽呢?它主要有以下幾個功能: 1、打開某個鏈接網址(彈窗)。 2、定位打開某個文件目錄。 3、打開系統特殊文件夾,如“控制面板

HTML中javascript的<script>標簽使用方法

mime類型 jsp source 方式 clas 處理 網頁 鏈接 屬性。 原文地址:HTML中javascript的<script>標簽使用方法詳解 只要一提到把JavaScript放到網頁中,就不得不涉及Web的核心語言——HTML。在當初開發javasc

解析xml的4種方法(轉)

項目 目標 源碼 更多 news 大量 優秀 大型 頻繁 http://blog.csdn.net/jzhf2012/article/details/8532873 1. 介紹 1)DOM(JAXP Crimson解析器) DOM是用與平臺和語言無關的方式表

php中二維數組排序問題方法

ges cti cmp each ace esc 對數 x11 用法 PHP中二維數組排序,可以使用PHP內置函數uasort() 示例一: 使用用戶自定義的比較函數對數組中的值進行排序並保持索引關聯 回調函數如下:註意回調函數的返回值是負數或者是false的時候,表

SylixOS 調試方法——靜態代碼分析

sylixos 調試方法1. SylixOS調試方法介紹SylixOS 實現了一個功能強大的調試 stub,可在設備或模擬器上在線調試應用程序,RealEvo-IDE 也提供配套的調試插件。目前 RealEvo-IDE 既支持自動推送調試、也支持傳統的手動啟動 gdbserver 的調試方式。在官方公布的使用

python魔法方法

返回 call __init__ and -m 描述 nbsp shift 賦值 文章來源:http://blog.csdn.net/koko66/article/details/42709279 據說,Python 的對象天生擁有一些神奇的方法,它們總被雙下劃線所包圍

PHP利用二叉堆實現TopK-算法的方法

相對 baidu 文本文件 過時 border 數據 http pan set 前言 在以往工作或者面試的時候常會碰到一個問題,如何實現海量TopN,就是在一個非常大的結果集裏面快速找到最大的前10或前100個數,同時要保證 內存和速度的效率,我們可能第一個想法就是利用排序

Python 字符串的所有方法

drive nes and tabs 英文 spa space cas ive 1 name = "my name is {name} and my age is {age}" 2 3 # 首字母大寫 4 name.capitalize() 5 # 統計某個字

JavaScript | 創建對象的9種方法

arr 常見 安全 圖解 margin cor *** 解析 刪除 ————————————————————————————————————————————————————————— 創建對象 標準對象模式 "use strict"; // *************

cmake使用方法

views iostream cross grep linu 文件內容 files 主目錄 動態 cmake 簡介 CMake是一個跨平臺的安裝(編譯)工具,可以用簡單的語句來描述所有平臺的安裝(編譯過程)。他能夠輸出各種各樣的makefile或者proj

JS中的call、apply、bind方法

面試 glob ble ole 內部 修改 sta illegal 解決 bind 是返回對應函數,便於稍後調用;apply 、call 則是立即調用 。 apply、call 在 javascript 中,call 和 apply 都是為了改變某個函數運行時的上下文(

Java中的main()方法

普通 什麽 javac 無限 reflect ase 理解 jvm cep 在Java中,main()方法是Java應用程序的入口方法,也就是說,程序在運行的時候,第一個執行的方法就是main()方法,這個方法和其他的方法有很大的不同,比如方法的名字必須是main,方法必須