Hibernate部分AP詳解

2021-09-01 17:09:33 字數 4458 閱讀 7886

1.configuration 介面

org.hibernate.cfg.configuration 介面的作用是載入主配置檔案及對映檔案,以實現對hibernate 的啟動。

configuration 例項的獲取方式:configuration cfg = new configuration().configure();

(1)new configuration()

new configuration()會載入乙個屬性檔案 hibernate.properties。該屬性檔案中存放著資料連線配置、hibernate 配置等配置資訊。一般情況下不用設定該屬性檔案,其設定已經放到了主配置檔案中。若要設定,應將其放於 src 目錄下。該檔案的模板存放於 hibernate 框架解壓目錄下的 project/etc 下。

(2)無參 configure()方法

configure()方法,預設用於載入和解析名稱為 hibernate.cfg.xml 的配置檔案,並通過主配置檔案找到並解析對映檔案。該方法返回乙個 configuration 物件。所以,cfg 是乙個包含配置資訊及對映資訊的 configuration 物件.

(3)帶參 configure()方法

hibernate 主配置檔案預設名稱為 hibernate.cfg.xml,應存放在 src 類路徑下。但也可以更換路徑與檔名。此時,需要使用帶參的 configuraion()方法。

2.sessionfactory介面

org.hibernate. sessionfactory 介面物件是由 configuration 物件通過 buildsessionfactory()方法建立。建立該物件的目的是,用於開啟 session 物件。sessionfactory sessionfactory = cfg.buildsessionfactory();

(1)sessionfactory 物件特點

重量級物件(系統開銷大)、單例的、執行緒安全的。

按理說,單例物件一定是被共享的,是執行緒不安全的。但檢視 sessionfactory 介面的實現類 sessionfactoryimpl 原始碼,可以看其大多數成員變數是 final 的,所以其是執行緒安全的。

(2)sessionfactory 物件的使用原則

基於其是執行緒安全的重量級物件,其建立與銷毀時系統開銷大,又是單例的特點,sessionfactory 物件一般不手工關閉,而是在應用結束時自動將其銷毀。因此,sessionfactory不用進行 close()關閉。

3.session介面

org.hibernate.classic.session 介面是應用程式與 hibernate 連線的核心 api,是 hibernate向應用程式提供的操縱 db 的最主要介面。它提供了基本的儲存、更新、刪除與查詢方法。由 sessionfactory 物件建立。

session s= sessionfactory.getcurrentsession();

(1)session 物件的特點

乙個輕量級物件、執行緒不安全的、多例的。

在 web 應用中,多個使用者對同一應用訪問,hibernate 會為每個使用者建立乙個 session物件。所以是多例的。session 中包含大量非 final 成員變數,對於同乙個使用者的操作,可能會產生多個事務,這多個事務若同時對同乙個 session 的同乙個成員變數進行訪問,就會引起併發問題。所以 session 是執行緒不安全的。

(2)session 物件的使用

基於 session 的以上特點,session 在使用時要做到乙個執行緒乙個 session,即乙個事務乙個 session。使用完畢,立即關閉。session 不要作為某個類的成員變數出現,因為這樣會出現多個例項物件對同乙個 session 的共享,使其更不安全。

(3)session 物件的獲取

sessionfactory 對於 session 物件的獲取,提供了兩種獲取方式:

為了保證乙個執行緒乙個 session,即乙個執行緒中使用的 session 是同乙個物件,一般在獲取 session 物件時,使用 sessionfactory 的 getcurrentsession()方法。不過,使用該方法獲取session 物件,需要在主配置檔案中對 session 所處的上下文環境,即事務環境進行註冊。

thread
hibernate.current_session_context_class 取值有三種:

hibernate.current_session_context_class 的三種取值 取值

意義thread

表示當前session所處的環境為本地事務環境,session會與當前執行緒繫結

jta表示當前session所處的環境為分布式事務環境

springsessioncontext類

ssh整合時使用。表示將當前session的管理權交由spring容器,而spring容器中會有事務環境。即當前session所處的環境為spring事務環境。

為什麼 getcurrentsession()方式獲取到的是同乙個物件?

getcurrentsession()首先會獲取到當前執行緒 thread.currentthread(),然後從 threadlocal中讀取 key 為當前執行緒的 value。而該 value 即為當前執行緒中的 session 物件。

當在 hibernate 主配置檔案中設定了 hibernate.current_session_context_class 屬性的值為thread 時,就表明每個使用者獲取到的 session 物件都是自己當前執行緒中的session,是同乙個session。

(4)session關閉

使用 getcurrentsession()方法獲取的 session,在進行事務提交或回滾後,會自動關閉,無需再手工進行 close()。當然,也不能在最後的 finally{}語句塊中對 session 進行手工關閉。因為,無論是執行事務的 commit(),還是執行 rollback(),均會在 finally{}之前執行。也就是說,在執行 finally{}之前,session 已經關閉。若再手工關閉,將丟擲異常。

總結:兩種獲取 session 物件方式的區別

getcurrentsession()方式

opensession()方式

獲取的物件

無論執行多少次該方法,只要是在同一執行緒中,獲取的都是同乙個session物件

每執行一次該方法,獲取到的都是乙個新的session物件。

物件的關閉

自動關閉session,無需手工關閉

必須手工關閉session物件

環境的註冊

需要註冊session的執行環境

無需註冊

查詢對事物的支援

查詢必須在事務內執行

查詢可以不再事務內執行

4.transaction介面

通過該介面,可以將事務從持久層,提公升到業務層。由 session 物件建立。

session.gettransaction();

事務的開啟:session.begintransaction(); 或 session.gettransaction().begin();

事務的提交:session.gettransaction().commit();

事務的回滾:session.gettransaction().rollback();

5.總結 -- 單例、多例與執行緒安全問題

單例與多例問題是指,當多個使用者訪問某個類時,系統是為每個使用者建立乙個該類例項,還是整個系統無論多少使用者訪問,只建立乙個該類例項。執行緒安全問題是指,多個使用者同時在訪問同乙個程式時,其對於某一資料的修改,會不會影響到其他使用者中的該資料。若沒有影響,則是執行緒安全的;若有可能影響,則是執行緒不安全的。

其是單例的。即無論多少使用者訪問同乙個業務,如 loginservlet,web 容器只會建立乙個該 servlet 例項。而該例項是允許多使用者訪問的。若 servlet 中包含成員變數,則每個使用者對於成員變數的修改,均會影響到其他使用者所看到的該變數的值,所以這時是執行緒不安全的。若不包含成員變數,則是執行緒安全的。

(3)struts2的action

(4)hibernate的sessionfactory

其是單例的。無論多少使用者訪問該專案,系統只會建立乙個 sessionfactory 物件,即這個物件是可以被所有使用者訪問的。sessionfactory 實現類中所包含的成員變數基本都是 final 常量,即任何使用者均不能修改。所以,也就不存在使用者的修改對其他使用者的影響問題了,所以是執行緒安全的。

(5)hibernate的session

其是多例的。系統會為每個使用者建立乙個 session。session 的實現類中定義了很多的非 final 成員變數,乙個事務對成員變數所做的修改,會影響到另乙個事務對同一資料的訪問結果,所以是執行緒不安全的。

Hibernate主鍵型別詳解

1 assigned 主鍵由外部程式負責生成,無需hibernate參與。2 hilo 通過hi lo 演算法實現的主鍵生成機制,需要額外的資料庫表儲存主 鍵生成歷史狀態。3 seqhilo 與hilo 類似,通過hi lo 演算法實現的主鍵生成機制,只是主鍵歷史 狀態儲存在sequence中,適用...

Hibernate框架API詳解

configuration物件 學習configuration物件 configuration功能 配置載入類.用於載入主配置,orm元資料載入 public class demo sessionfactory物件 學習sessionfactory物件 sessionfactory功能 用於建立運算...

Hibernate中用hql查詢部分字段

在hibernate中,用hql語句查詢實體類,採用list方法的返回結果為乙個list,該list中封裝的物件分為以下三種情況 1.查詢全部欄位的情況下,如 from 實體類 list中封裝的物件為實體類本身,各屬性都將得到填充。2.只查詢乙個字段,預設情況下,list中封裝的是object物件。...