Hibernate中的Session管理和對話實現
1 管理Session物件
Session物件的管理方式:
- 應用程式序自主管理Session;
- Hibernate管理Session。
1.1 應用程式自主管理Session
應用程式自主管理Session物件的生命週期時,何時建立Session、何時清理快取及何時關閉Session都有程式負責。
缺點:1)程式碼重複;2)多個類共享同一個Session物件比較麻煩。
1.2 Hibernate管理Session
Hibernate管理Session的三種方式:
- Session物件的生命週期與本地執行緒繫結(Hibernate負責將Session與本地執行緒繫結)
- Session物件的生命週期與JTA事務繫結
- Hibernate 委託程式管理Session物件的生命週期(也就是說,應用程式自主管理Session物件時,藉助於Hibernate將Session與本地執行緒繫結)
在Hibernate的配置檔案Hibernate.cfg.xml中設定session的管理方式:
<property name="current_session_context_class">thread</property> //thread也可以換成jta或managed,分別對應三種管理方式;
1 Session物件的生命週期與本地執行緒繫結
- 建立Session:當一個執行緒呼叫SessionFactory的getCurrentSession()方法,而且此時沒有Session與當前執行緒繫結時,Hibernate自動建立Session物件
- 關閉Session:當一個執行緒提交或撤銷事務後,Hibernate自動關閉Session物件。
2 Session物件生命週期與JTA事務繫結
- 建立Session:當一個執行緒呼叫SessionFactory的getCurrentSession()方法,而且此時沒有Session與當前JTA事務繫結時,Hibernate自動建立Session物件
- 關閉Session:當一個執行緒提交或撤銷JTA事務後,Hibernate自動關閉Session物件。
Session物件與本地執行緒和與JTA事務繫結的區別:
前者是先有Session物件,然後由Session物件的beginTransaction()方法宣告一個事務;而後者是先通過UserTransaction介面宣告開始一個JTA事務,然後出現與該JTA繫結的Session物件。
3 Hibernate委託程式管理Session物件
org.hibernate.context.ManagedSessionContext的靜態方法:
- bind(Session session):把Session與當前執行緒繫結。
- unbind(SessionFactory factory):解除Session物件與當前執行緒的繫結。
- hasBind(SessionFactory factory):判斷是否存在與當前執行緒繫結的Session物件。
應用程式可以利用上面提供的方法來將session物件與當前執行緒繫結。
- 建立Session :Session物件由程式決定何時建立,當程式建立Session物件後或者宣告開始一個事務前,利用bind()方法將Session與當前執行緒繫結。
- 關閉Sesssion:程式決定何時關閉一個Session物件。當程式提交一個事務之前,呼叫unbind()方法,解除Session物件與當前執行緒的繫結。
2 實現對話
對話:包含了使用者思考時間的長工作單元。會話必須滿足:1. 資料一致性,即防止併發問題。2. 原子性。
對話的實現方式有三種:
- 整個對話對應一個事務,並且與一個Session物件對應。1:1:1
- 使用遊離物件:一個對話包括多個短事務,並且每個短事務對應一個單獨的Session物件。事務之間通過遊離物件傳遞業務資料。1:n:n
- 使用手工快取模式下的Session物件:一個對話包含多個短事務,並且整個對話對應一個Session物件。1:n:1
三種實現對話方式比較如下圖所示:
相關推薦
Hibernate中的Session管理和對話實現
1 管理Session物件 Session物件的管理方式: 應用程式序自主管理Session;Hibernate管理Session。1.1 應用程式自主管理Session 應用程式自主管理Session物件的生命週期時,何時建立Session、何時清理快取及何時關閉Sess
hibernate中session.get( , )和session.load( , )的使用及區別
get(Class clazz,id)和load(Class clazz,id)都是用來根據主鍵的內容查詢資料庫中資料,並且返回相對應的類的物件 用法如下: public static void main(String[] args) { //讀取總的配置檔案 C
Hibernate中session管理
儘管讓程式自主管理 Session 物件的生命週期也是可行的, 但是在實際 Java 應用中, 把管理 Session 物件的生命週期交給 Hibernate 管理, 可以簡化 Java 應用程式程式碼和軟體架構。 Hibernate 3 自身提供了三種管理 Session
Hibernate中session.get()和session.load()的區別
實際上,兩個方法都是用來從資料庫獲取物件,只不過實現機制不一樣而已。 1. session.load() 這種方式總是會返回一個代理而不是真正得去查詢資料庫。 在Hibernate裡面,代理是一個依據ID值獲取到的物件,該物件的屬性還沒有初始化,它看起來就是一個臨時的虛擬物件而已。
Hibernate中session get 和load的區別,物件生命週期
Hibernate中會話get和load的區別 get()方法會立即查詢(快取中有則不查詢),load()懶載入,直到你需要用到資料的時候才去查資料庫 找不到物件時get()是返回NULL,load()會拋異常; 因此使用load()方法時,要確認查詢的主鍵ID是一定存在的。 loa
hibernate中session線程安全的實現
hibernate中的session session的線程安全 threadlocal模式 在hibernate中session是使用ThreadLocal實現線程安全的。ThreadLocal並不是一個Thread,而是一個線程副本,ThreadLocal為每個使用該變量的線程提供一個變量副本,
Hibernate中Session之get和load方法的真正區別
repl .get user href 獲得 tno lose 錯誤 ftw 最近在學習SHH框架中的hibernate,對Session的get和load方法,有點混不清楚,不知道區別在哪,或者對它們的區別感觸不深。所以百度了一下,結果問題來了。百度的結果和實際測試
Hibernate中Session的load和get方法的區別是什麼?
①如果沒有找到符合條件的記錄,get方法返回null,load方法丟擲異常。 ② get方法直接返回實體類物件,load方法返回實體類物件的代理。 ③ 在Hibernate 3之前,get方法只在一級快取中進行資料查詢,如果沒有找到對應的資料則越過二級快取,直接發出SQL
Hibernate中get方法和load方法的區別
pub 機制 否則 on() color 檢索 不存在 bsp 數據庫查詢 1.從返回結果上對比: load方式檢索不到的話會拋出org.hibernate.ObjectNotFoundException異常; get方法檢索不到的話會返回null; 2.從檢索執行機制上對
Hibernate中Session與本地線程綁定
row 增長 conn exception driver 已提交 ges 數據 class ------------------siwuxie095 Hibernate 中 Session 與本地線程綁定 1、
Hibernate中session常用方法
hql1.session.save(實體類) 保存2.session.get(實體類的字節碼文件,變量id)3.session.update(實體類)4.session.delete(實體類)5.查詢使用query對象來查詢Query q = session.createQuery(hql)什麽是hqlhql
hibernate中的load和get區別
package com.zking.dao.daoImpl; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.Transact
hibernate中的HQL和QBC查詢
建立session及事務 //1.讀取src下hibernate.cfg.xml配置檔案 Configuration cft = new Configuration(); Configuration configure = cft.con
hibernate中一對多和多對多關係
一對多: 一個部門對應多個員工,一個員工只能屬於某一個部門。 &nb
Hibernate中的createSQL和createSQLQuery的區別?
Hibernate中的createQuery與createSQLQuery區別是: 前者是hql語句進行查詢,後者可以用sql語句查詢。前者以hibernate生成的bean為物件裝入list返回,後者則是以物件陣列進行儲存。 下面的案例輔助我們進行理解: PO:User.c
shell中使用sort和uniq實現兩檔案的並集,交集和差集
網上轉的,不錯,比使用awk容易點 給定兩個檔案 a.txt 和 b.txt ,每行是一個記錄(假設沒有重複),要求輸出兩集合的交集、並集、差集,輸出的結果只包括唯一項。交集定義為同時出現在兩個檔案中的記錄項,並集定義為出現在任何一個檔案中的記錄項,差集(A-B)定義為出現在A中而且不出現在B中的記
hibernate中session的相關方法(save,persist get,load saveOrUpdate delete evict)
Save()與persist()方法區別 1.save()方法 使一個臨時物件變為持久化物件,為物件分配id,在flush快取時,會發送一條insert語句,在save()方法之前id設定是無效的
hibernate中session的獲取使用以及其他注意事項
hibernate中session的獲取使用以及其他注意事項 前言:工作時,在同時使用Hibernate的getSession()、getHibernateTemplate()獲取Session後進行資料查詢時不是出現了"session is close"異常就是出現其他異常問題,痛定思痛,決定收集並整理相
利用ES6中的Proxy和Reflect 實現簡單的雙向數據綁定
prope tlist lec ntb col lis pan pro ref 利用ES6中的Proxy (代理) 和 Reflect 實現一個簡單的雙向數據綁定demo。 好像vue3也把 obj.defineProperty() 換成了Proxy+Reflect。
Hibernate中lazy="proxy"和lazy="no-proxy"的區別
精妙的例子 Child <- many-to-one ->Parent class Child { private Paren