1. 程式人生 > >Hibernate中的Session管理和對話實現

Hibernate中的Session管理和對話實現

1 管理Session物件

Session物件的管理方式:

  1. 應用程式序自主管理Session;
  2. 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. 原子性。

對話的實現方式有三種:

  1. 整個對話對應一個事務,並且與一個Session物件對應。1:1:1
  2. 使用遊離物件:一個對話包括多個短事務,並且每個短事務對應一個單獨的Session物件。事務之間通過遊離物件傳遞業務資料。1:n:n
  3. 使用手工快取模式下的Session物件:一個對話包含多個短事務,並且整個對話對應一個Session物件。1:n:1

三種實現對話方式比較如下圖所示:


相關推薦

HibernateSession管理對話實現

1 管理Session物件 Session物件的管理方式: 應用程式序自主管理Session;Hibernate管理Session。1.1 應用程式自主管理Session 應用程式自主管理Session物件的生命週期時,何時建立Session、何時清理快取及何時關閉Sess

hibernatesession.get( , )session.load( , )的使用及區別

get(Class clazz,id)和load(Class clazz,id)都是用來根據主鍵的內容查詢資料庫中資料,並且返回相對應的類的物件 用法如下: public static void main(String[] args) { //讀取總的配置檔案 C

Hibernatesession管理

儘管讓程式自主管理 Session 物件的生命週期也是可行的, 但是在實際 Java 應用中, 把管理 Session 物件的生命週期交給 Hibernate 管理, 可以簡化 Java 應用程式程式碼和軟體架構。 Hibernate 3 自身提供了三種管理 Session

Hibernatesession.get()session.load()的區別

實際上,兩個方法都是用來從資料庫獲取物件,只不過實現機制不一樣而已。   1. session.load() 這種方式總是會返回一個代理而不是真正得去查詢資料庫。 在Hibernate裡面,代理是一個依據ID值獲取到的物件,該物件的屬性還沒有初始化,它看起來就是一個臨時的虛擬物件而已。

Hibernatesession get load的區別,物件生命週期

Hibernate中會話get和load的區別 get()方法會立即查詢(快取中有則不查詢),load()懶載入,直到你需要用到資料的時候才去查資料庫 找不到物件時get()是返回NULL,load()會拋異常; 因此使用load()方法時,要確認查詢的主鍵ID是一定存在的。 loa

hibernatesession線程安全的實現

hibernate中的session session的線程安全 threadlocal模式 在hibernate中session是使用ThreadLocal實現線程安全的。ThreadLocal並不是一個Thread,而是一個線程副本,ThreadLocal為每個使用該變量的線程提供一個變量副本,

HibernateSession之getload方法的真正區別

repl .get user href 獲得 tno lose 錯誤 ftw 最近在學習SHH框架中的hibernate,對Session的get和load方法,有點混不清楚,不知道區別在哪,或者對它們的區別感觸不深。所以百度了一下,結果問題來了。百度的結果和實際測試

HibernateSession的loadget方法的區別是什麼?

①如果沒有找到符合條件的記錄,get方法返回null,load方法丟擲異常。  ② get方法直接返回實體類物件,load方法返回實體類物件的代理。 ③ 在Hibernate 3之前,get方法只在一級快取中進行資料查詢,如果沒有找到對應的資料則越過二級快取,直接發出SQL

Hibernateget方法load方法的區別

pub 機制 否則 on() color 檢索 不存在 bsp 數據庫查詢 1.從返回結果上對比: load方式檢索不到的話會拋出org.hibernate.ObjectNotFoundException異常; get方法檢索不到的話會返回null; 2.從檢索執行機制上對

HibernateSession與本地線程綁定

row 增長 conn exception driver 已提交 ges 數據 class ------------------siwuxie095 Hibernate 中 Session 與本地線程綁定 1、

Hibernatesession常用方法

hql1.session.save(實體類) 保存2.session.get(實體類的字節碼文件,變量id)3.session.update(實體類)4.session.delete(實體類)5.查詢使用query對象來查詢Query q = session.createQuery(hql)什麽是hqlhql

hibernate的loadget區別

package com.zking.dao.daoImpl; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.Transact

hibernate的HQLQBC查詢

  建立session及事務 //1.讀取src下hibernate.cfg.xml配置檔案 Configuration cft = new Configuration(); Configuration configure = cft.con

hibernate一對多多對多關係

一對多:                     一個部門對應多個員工,一個員工只能屬於某一個部門。             &nb

Hibernate的createSQLcreateSQLQuery的區別?

 Hibernate中的createQuery與createSQLQuery區別是: 前者是hql語句進行查詢,後者可以用sql語句查詢。前者以hibernate生成的bean為物件裝入list返回,後者則是以物件陣列進行儲存。 下面的案例輔助我們進行理解: PO:User.c

shell使用sortuniq實現兩檔案的並集,交集差集

網上轉的,不錯,比使用awk容易點 給定兩個檔案 a.txt 和 b.txt ,每行是一個記錄(假設沒有重複),要求輸出兩集合的交集、並集、差集,輸出的結果只包括唯一項。交集定義為同時出現在兩個檔案中的記錄項,並集定義為出現在任何一個檔案中的記錄項,差集(A-B)定義為出現在A中而且不出現在B中的記

hibernatesession的相關方法(save,persist get,load saveOrUpdate delete evict)

        Save()與persist()方法區別   1.save()方法 使一個臨時物件變為持久化物件,為物件分配id,在flush快取時,會發送一條insert語句,在save()方法之前id設定是無效的

hibernatesession的獲取使用以及其他注意事項

hibernate中session的獲取使用以及其他注意事項 前言:工作時,在同時使用Hibernate的getSession()、getHibernateTemplate()獲取Session後進行資料查詢時不是出現了"session is close"異常就是出現其他異常問題,痛定思痛,決定收集並整理相

利用ES6的ProxyReflect 實現簡單的雙向數據綁定

prope tlist lec ntb col lis pan pro ref 利用ES6中的Proxy (代理) 和 Reflect 實現一個簡單的雙向數據綁定demo。 好像vue3也把 obj.defineProperty() 換成了Proxy+Reflect。

Hibernatelazy="proxy"lazy="no-proxy"的區別

精妙的例子 Child   <-   many-to-one   ->Parent           class   Child   {          private   Paren