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 俗話說:常在河邊走,哪有不溼鞋。經常海淘的人難免會遇見包裹被海關查驗而徵稅或退運的情況,但是由於目前海關、郵政在被稅包裹查詢以及操作處理上等的一些問題,常常導致海淘第一次被稅的使
LSTM中tf.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
JavaScript中return的用法詳解
style 返回 www log tle blog 意思 charset fun 1、定義:return 從字面上的看就是返回,官方定義return語句將終止當前函數並返回當前函數的值,可以看下下面的示例代碼: <!DOCTYPE html><html l