1. 程式人生 > >Hibernate中的事務處理流程詳解

Hibernate中的事務處理流程詳解

一、Hibernate操作的基本流程
使用 Hibernate 進行資料持久化操作,通常有如下步驟:
1、編寫持久化類: POJO + 對映檔案
2、獲取 Configuration 物件
3、獲取 SessionFactory 物件
4、獲取 Session,開啟事務
5、用面向物件的方式操作資料庫
6、關閉事務,關閉 Session

二、配置檔案hibernate.cfg.xml詳解

<!--標準的XML檔案的起始行,version='1.0'表明XML的版本,encoding='UTF-8'表明XML檔案的編碼方式--> 
                <?xml version='1.0' encoding='UTF-8'?> 
<!--表明解析本XML檔案的DTD文件位置,DTD是Document Type Definition 的縮寫,即文件型別的定義,XML解析器使用DTD文件來檢查XML檔案的合法性。hibernate.sourceforge.net/hibernate-configuration-3.0dtd可以在Hibernate3.1.3軟體包中的src\org\hibernate目錄中找到此檔案--> 
<!DOCTYPE hibernate-configuration PUBLIC 
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
    <!--宣告Hibernate配置檔案的開始-->      
    <hibernate-configuration> 
    <!--表明以下的配置是針對session-factory配置的,SessionFactory是Hibernate中的一個類,這個類主要負責儲存HIbernate的配置資訊,以及對Session的操作--> 
      <session-factory>    
      <!--配置資料庫的驅動程式,Hibernate在連線資料庫時,需要用到資料庫的驅動程式--> 
          <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver </property> 
      <!--設定資料庫的連線url:jdbc:mysql://localhost/hibernate,其中localhost表示mysql伺服器名稱,此處為本機,    hibernate是資料庫名-->  
            <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate </hibernate> 
    <!--連線資料庫是使用者名稱--> 
          <property name="hibernate.connection.username">root </property> 
          <!--連線資料庫是密碼--> 
          <property name="hibernate.connection.password">123456 </property>        
          <!--資料庫連線池的大小--> 
          <property name="hibernate.connection.pool.size">20 </property>        
        <!--是否在後臺顯示Hibernate用到的SQL語句,開發時設定為true,便於查錯,程式執行時可以在Eclipse的控制檯顯示Hibernate的執行Sql語句。專案部署後可以設定為false,提高執行效率--> 
        <property name="hibernate.show_sql">true </property> 
        <!--jdbc.fetch_size是指Hibernate每次從資料庫中取出並放到JDBC的Statement中的記錄條數。Fetch Size設的越大,讀資料庫的次數越少,速度越快,Fetch Size越小,讀資料庫的次數越多,速度越慢--> 
        <property name="jdbc.fetch_size">50 </property> 
        <!--jdbc.batch_size是指Hibernate批量插入,刪除和更新時每次操作的記錄數。Batch Size越大,批量操作的向資料庫傳送Sql的次數越少,速度就越快,同樣耗用記憶體就越大--> 
        <property name="jdbc.batch_size">23 </property> 
        <!--jdbc.use_scrollable_resultset是否允許Hibernate用JDBC的可滾動的結果集。對分頁的結果集。對分頁時的設定非常有幫助--> 
        <property name="jdbc.use_scrollable_resultset">false </property> 
        <!--connection.useUnicode連線資料庫時是否使用Unicode編碼--> 
        <property name="Connection.useUnicode">true </property> 
        <!--connection.characterEncoding連線資料庫時資料的傳輸字符集編碼方式,最好設定為UTF-8--> 
    <property name="connection.characterEncoding">UTF-8 </property>      
        
        <!--hibernate.dialect 只是Hibernate使用的資料庫方言,就是要用Hibernate連線那種型別的資料庫伺服器。--> 
          <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect </property> 
        <!--指定對映檔案為“hibernate/ch1/UserInfo.hbm.xml”-->        
          <mapping resource="org/mxg/UserInfo.hbm.xml"> 
  </session-factory> 
  </hibernate-configuration>    

三、Hibernate對映檔案

Hibernate對映檔案是Hibernate與資料庫進行持久化的橋樑Hibernate對映檔案主要內容:
1、對映內容的定義
Hibernate對映檔案由<hibernate-mapping package="JavaBean所在包的全路徑">節點,來定義對映內容並指定所對應的JavaBean的位置(也可以不在該節點中用package屬性指定對應的JavaBean位置,而在該節點下的class節點中的name屬性中指定)
2、資料庫和JavaBean的關聯:
Hibernate對映檔案中用<hibernate-mapping>節點下的
<class name="JavaBean的全類名" table="對應資料庫中的表名">節點指定資料庫表和JavaBean的關聯。
<class name="com.chen.TRegister" table="TREGISTER">  
3、主鍵對映:
在<class >節點下用
<id name="資料庫中主鍵在JavaBean中的屬性名稱" type="對應的javaBean中的資料型別">節點對映對應的主鍵,該節點必須有且只有一個(因為主鍵只有一個),同時必須放在<property ...>節點前
<id name="id" type="java.lang.Integer">  
            <column name="ID" />    
            <generator class="increment" />  
</id>     
4、heibernate的主鍵對映方式     
在<id ...>節點下用<generator class="對映方式"/>節點指定Hibernate向資料庫插入資料時主鍵的生成方式。
** assigned:應用程式自身對id賦值。當設定<generator class="assigned"/>時,應用程式自身需要負責主鍵id的賦值,由外部程式負責生成(在session.save()之前為物件的主鍵設定值),無需Hibernate參與,一般應用在主鍵為自然主鍵時。例如XH為主鍵時,當新增一個學生資訊時,就需要程式設計師自己設定學號的值,這時就需要應用該id生成器。
** native:由資料庫對id賦值。當設定<generator class="native"/>時,資料庫負責主鍵id的賦值,最常見的是int型的自增型主鍵。例如,在SQLServer中建立表的id欄位為identity,配置了該生成器,程式設計師就不用為該主鍵設定值,它會自動設定。
** identity:採用資料庫提供的主鍵生成機制,為long/short/int型列生成唯一標識如SQL Server、MySQL中的自增主鍵生成機制。
** hilo:通過hi/lo演算法實現的主鍵生成機制,需要額外的資料庫表儲存主鍵生成歷史狀態。
** seqhilo:與hi/lo類似,通過hi/lo演算法實現的主鍵生成機制,只是主鍵歷史狀態儲存在sequence中,適用於支援sequence的資料庫,如Oracle。
** increment:主鍵按數值順序遞增。此方式的實現機制為在當前應用例項中維持一個變數,以儲存當前的最大值,之後每次需要生成主鍵的時候將此值加1作為主鍵。這種方式可能產生的問題是:如果當前有多個例項訪問同一個資料庫,由於各個例項各自維護主鍵狀態,不同例項可能生成同樣的主鍵,從而造成主鍵重複異常。因此,如果同一個資料庫有多個例項訪問,這種方式應該避免使用
** sequence:採用資料庫提供的sequence機制生成主鍵,用於用序列方式產生主鍵的資料庫(如:Oracle、DB2等的Sequence),用於為long/short/int型列生成唯一標識,如:<generator class="sequence"><param name="sequence">序列名</param></generator>如Oracle sequence。
** uuid.hex:由Hibernate基於128位唯一值產生演算法,根據當前裝置IP、時間、JVM啟動時間、內部自增量等4個引數生成十六進位制數值(編碼後長度為32位的字串表示)作為主鍵。即使是在多例項併發執行的情況下,這種演算法在最大程度上保證了產生id的唯一性。當然,重複的概率在理論上依然存在,只是概率比較小。一般而言,利用uuid.hex方式生成主鍵將提供最好的資料插入效能和資料平臺適應性。
** uuid.string:與uuid.hex類似,只是對生成的主鍵進行編碼(長度為16位)。在某些資料庫中可能出現問題。
** foreign:使用外部表的欄位作為主鍵。該主鍵一般應用在表與表之間的關係上,會在後面的表對應關係上進一步講解。
** select:Hibernate 3新引入的主鍵生成機制,主要針對遺留系統的改造工程。
由於常用的資料庫,如SQLServer、MySQL等,都提供了易用的主鍵生成機制(如auto-increase欄位),可以在資料庫提供的主鍵生成機制上,採用native生成器來配置主鍵生成方式。
5、普通欄位對映:
在<class ...>節點下用
<property name="資料庫中欄位在JavaBean中的屬性名稱" column name="資料庫中的欄位名" type="資料型別"/>節點對映普通欄位,該節點可有多個(一個欄位用一個該節點來對映)  
<property name="userName" type="java.lang.String">
            <column name="USERNAME" />
        </property>
<property name="userPwd" type="java.lang.String">
            <column name="USERPWD" />
        </property>
<property name="sex" type="java.lang.String">
            <column name="SEX" />
        </property>
<property name="age" type="java.lang.Integer">
            <column name="AGE" />
        </property>
     

四、Configuration 類

1、Configuration 類負責管理 Hibernate 的配置資訊。包括如下內容:
Hibernate 執行的底層資訊:資料庫的URL、使用者名稱、密碼、JDBC驅動類,資料庫Dialect,資料庫連線池等(對應 hibernate.cfg.xml 檔案),還包括持久化類與資料表的對映關係(*.hbm.xml 檔案)
2、建立 Configuration 的兩種方式
**  屬性檔案(hibernate.properties):
Configuration cfg = new Configuration();
**   Xml檔案(hibernate.cfg.xml)
Configuration cfg = new Configuration().configure();
Configuration 的 configure 方法還支援帶引數的訪問:
File file = new File(“simpleit.xml”);
Configuration cfg = new Configuration().configure(file);

//載入Hibernate的配置檔案
            Configuration config = new Configuration().configure("/hibernate/hibernate.cfg.xml");
            //還可以載入對映檔案
            Configuration config = new Configuration().addFile("TRegister.hbm.xml");//方法一
            Configuration config = new Configuration().addClass(hibernate.PO.TRegister.class);//方法二
            Configuration config = new Configuration().addURL(Configuration.class.getResource("TRegister.hbm.xml"));//方法三
            
五、SessionFactory介面

1、針對單個數據庫對映關係經過編譯後的記憶體映象,是執行緒安全的。 SessionFactory 物件一旦構造完畢,即被賦予特定的配置資訊。
2、SessionFactory是生成Session的工廠。構造 SessionFactory 很消耗資源,一般情況下一個應用中只初始化一個 SessionFactory 物件。
3、Hibernate4 新增了一個 ServiceRegistry 介面,所有基於 Hibernate 的配置或者服務都必須統一向這個 ServiceRegistry  註冊後才能生效
Hibernate4 中建立 SessionFactory 的步驟:

Configuration config = new Configuration().configure();  
ServiceRegistry serviceRegistry=  
         new ServiceRegistryBuilder().applySettings(config.getProperties())  
         .buildServiceRegistry();  
sessionFactory = config.buildSessionFactory(serviceRegistry);  

當客戶端傳送一個請求執行緒時,SessionFactory生成一個Session物件來處理客戶請求,如下: 
  public static final ThreadLocal session = new ThreadLocal();
    
    public static Session currentSession() throws HibernateException
    {
        Session s = (Session)session.get();
        //Open a new Session,if this Thread has none yet
        //如果此執行緒還沒有開啟一個Session,則新建一個
        if(s == null || !s.isOpen())
        {
            s = sessionFactory.openSession();
            session.set(s);
        }
        return s;
    }


六、Session介面

Session 是應用程式與資料庫之間互動操作的一個單執行緒物件,是 Hibernate 運作的中心,所有持久化物件必須在 session 的管理下才可以進行持久化操作。此物件的生命週期很短。Session 物件有一個一級快取,顯式執行 flush 之前,所有的持久層操作的資料都快取在 session 物件處。相當於 JDBC 中的 Connection。

Session物件是通過SessionFactory建立的:
         Session      session = SessionFactory.openSession();
一個持久化類與普通的JavaBean沒有任何區別,但是它與Session關聯後,就具有了持久化能力。當然,這種持久化操作是受Session控制的,即通過Session物件的裝載,儲存,建立或查詢持久化物件。Session類的save(),delete()和load()等方法,來分別完成對持久化物件的儲存,刪除,修改載入等操作!Session類方法的用途可以分以下五類:
1:取得持久化物件:get()和load()等方法。
2:持久化物件的儲存,更新和刪除:save(),update()saveOrUpdate()和delete()等方法。
3:createQuery()方法:用來從Session生成的Query物件。
4:beginTransaction()方法:從Session物件生成一個Transaction物件。
5:管理Session的方法:isOpen(),flush(),clear(),evict()和close()等方法,其中isOpen()方法用來檢查Session是否仍然開啟;flush()用來清理Session快取,並把快取中的SQL語句傳送出去,clear()用來清除Session中的所有快取物件evict()方法來清楚Session快取中的某個物件;close()關閉Session。

七、Transaction(事務)

Transaction代表一次原子操作,它具有資料庫事務的概念。所有持久層都應該在事務管理下進行,即使是隻讀操作。 
  Transaction tx = session.beginTransaction();
常用方法:
commit():提交相關聯的session例項
rollback():撤銷事務操作
wasCommitted():檢查事務是否提交

相關推薦

Hibernate事務處理流程

一、Hibernate操作的基本流程 使用 Hibernate 進行資料持久化操作,通常有如下步驟: 1、編寫持久化類: POJO + 對映檔案 2、獲取 Configuration 物件 3、獲取 SessionFactory 物件 4、獲取 Session,開啟事務 5

分享知識-快樂自己:Hibernate Criteria Query查詢

limit all des 結合 project 實現簡單 result eager sele 1):Hibernate 中Criteria Query查詢詳解 當查詢數據時,人們往往需要設置查詢條件。在SQL或HQL語句中,查詢條件常常放在where子句中。 此外,Hib

Spring mvc請求處理流程(一)之檢視解析

前言   Spring mvc框架相信很多人都很熟悉了,關於這方面的資料也是一搜一大把。但是感覺講的都不是很細緻,讓很多初學者都雲裡霧裡的。本人也是這樣,之前研究過,但是後面一段時間不用發現又忘記了。所以決定寫下來,以備後用。   本系列文基於spring-

Hibernate一二級快取使用

一、一級快取二級快取的概念解釋 (1)一級快取就是Session級別的快取,一個Session做了一個查詢操作,它會把這個操作的結果放在一級快取中,如果短時間內這個session(一定要同一個session)又做了同一個操作,那麼hibernate直接從一級快取中拿,而

openstack-wsgi的route增加api流程(os-networks)增加

感謝朋友支援本部落格,歡迎共同探討交流,由於能力和時間有限,錯誤之處在所難免,歡迎指正! 如有轉載,請保留源作者部落格資訊。 如需交流,歡迎大家部落格留言。 在前面文章中,已經詳細介紹了,如何從頁面dashboard呼叫novaclient然後生成一個url

.net/c#棧和堆的區別及程式碼在棧和堆的執行流程

在.NET framework環境下,當我們的程式碼執行時,記憶體中有兩個地方用來儲存這些程式碼。假如你不曾瞭解,那就讓我來給你介紹棧(Stack)和堆(Heap)。棧和堆都用來幫助我們執行程式碼的,它們駐留在機器記憶體中,且包含所有程式碼執行所需要的資訊。 棧負責儲存我們的程式碼執行(或呼叫)路徑,而

日本轉運海淘包裹被稅、退運處理流程—北京篇

http://mt.sohu.com/20151231/n434280446.shtml   俗話說:常在河邊走,哪有不溼鞋。經常海淘的人難免會遇見包裹被海關查驗而徵稅或退運的情況,但是由於目前海關、郵政在被稅包裹查詢以及操作處理上等的一些問題,常常導致海淘第一次被稅的使

LSTMtf.nn.dynamic_rnn處理過程

在唐宇迪之tensorflow學習筆記專案實戰(LSTM情感分析)一文中,連結地址如下https://blog.csdn.net/liushao123456789/article/details/78991581。對於tf.nn.dynamic_rnn處理過程的程式碼如下,但

InputDispatcher按鍵分發之notifyKey之後流程

  該篇文章僅分析notifyKey之後的流程,InputReader怎麼讀取之類的本文不關心.本文重點關注InputDispatcher和java層的互動,包括呼叫interceptKeyBeforeQueueing和interceptKeyBeforeDispatchin

大資料筆記--hadoop的hdfs寫資料流程

上圖是一個簡版的流程圖,圖畫的不標準,但能說明問題就OK,下面是根據上圖描述的寫資料流程,如有不對的地方請指教。 注:以下簡化名稱所對應的全稱: NN == NameNode; IO == hdfsFileoutputStream; DN == DataNod

Hibernate框架的快取技術

Hibernate框架的快取分為Session的快取、SessionFactory的快取,也稱為一級快取和二級快取。 一級快取: 一級快取是Session級的快取,其生命週期很短,與Session相互對應,由Hibernate進行管理,屬於事務範圍的快取。當程式呼叫 Session的load

大資料筆記 1--hadoop的hdfs寫資料流程

上圖是一個簡版的流程圖,圖畫的不標準,但能說明問題就OK,下面是根據上圖描述的寫資料流程,如有不對的地方請指教。 注:以下簡化名稱所對應的全稱: NN == NameNode; IO == hdfsFileoutputStream; DN == DataNode; DN1 == Dat

影象處理的數學原理17——卷積定理及其證明

http://blog.csdn.net/baimafujinji/article/details/484672251.4.5   卷積定理及其證明卷積定理是傅立葉變換滿足的一個重要性質。卷積定理指出,

影象處理的數學原理11——線性空間

全文目錄請見http://blog.csdn.net/baimafujinji/article/details/484672252.3  泛函與抽象空間牛頓說:“把簡單的問題看得複雜,可以發現新領域;把複雜的問題看得簡單,可以發現新規律。”而從歷史的角度來看,一個學科的發展也

影象處理的數學原理(Part1 總綱)

數字影象處理技術的研究與開發對數學基礎的要求很高,一些不斷湧現的新方法中,眼花繚亂的數學推導令很多期待深入研究的人望而卻步。一個正規理工科學生大致已經具備了包括微積分、線性代數、概率論在內的數學基礎。但

Microsoft SQL Server事務與併發

本篇索引: 1、事務 2、鎖定和阻塞 3、隔離級別 4、死鎖 一、事務 1.1 事務的概念   事務是作為單個工作單元而執行的一系列操作,比如查詢和修改資料等。   事務是資料庫併發控制的基本單位,一條或者一組語句要麼全部成功,對資料庫中的某些資料成功修改; 要麼全部不成功,資料庫中的

hibernate在myeclipse的配置過程

1、  資料庫設計 建立crud.student資料庫表: 圖1 資料庫表 你可以使用如下語句建立該庫表: create database if not exists `crud`; USE `crud`; DROP TABLE IF EXISTS `student`; CREATE TABL

影象處理的數學原理(Part8) ——傅立葉變換的來龍去脈

全文目錄請見http://blog.csdn.net/baimafujinji/article/details/48467225千呼萬喚始出來,我們前面已經做了很多很多的準備,終於可以揭開傅立葉變換的面

【Unity】ios平臺IAP內購和沙箱測試流程(開發遇到的坑)

Unity iOS內購 內購流程 1、在 AppStore 中建立相應的物品,建立內購沙盒測試賬號2、客戶端從後臺獲取相應的物品 ID (當然也可以再客戶端寫死,但後期擴充套件性就受限制了)3、依據相應的物品 ID 請求商品的相關資訊4、依據商品資訊建立訂單請求交易5

JavaScriptreturn的用法

style 返回 www log tle blog 意思 charset fun 1、定義:return 從字面上的看就是返回,官方定義return語句將終止當前函數並返回當前函數的值,可以看下下面的示例代碼: <!DOCTYPE html><html l