日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 學院 > 開發設計 > 正文

Hibernate入門 - Transaction

2019-11-18 13:56:26
字體:
來源:轉載
供稿:網友

  Hibernate是對JDBC的輕量級對象封裝,Hibernate本身是不具備Transaction處理功能的,Hibernate的Transaction實際上是底層的JDBC Transaction的封裝,或者是JTA Transaction的封裝,下面我們具體的分析:

Hibernate可以配置為JDBCTransaction或者是JTATransaction,這取決于你在hibernate.PRoperties中的配置:

#hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory
#hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory

假如你什么都不配置,默認情況下使用JDBCTransaction,假如你配置為:

hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory

將使用JTATransaction

不管你預備讓Hibernate使用JDBCTransaction,還是JTATransaction,我的忠告就是什么都不配,將讓它保持默認狀態,如下:

#hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory
#hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory

在下面的分析中我會給出原因。

一、JDBC Transaction

看看使用JDBC Transaction的時候我們的代碼例子:

session session = sf.openSession();
Transaction tx = session.beginTransactioin();
...
session.flush();
tx.commit();
session.close();

這是默認的情況,當你在代碼中使用Hibernate的Transaction的時候實際上就是JDBCTransaction。那么JDBCTransaction究竟是什么東西呢?來看看源代碼就清楚了:

Hibernate2.0.3源代碼中的類

net.sf.hibernate.transaction.JDBCTransaction:

public void begin() throws HibernateException {

...
if (toggleAutoCommit) session.connection().setAutoCommit(false);
...
}

這是啟動Transaction的方法,看到 connection().setAutoCommit(false) 了嗎?是不是很熟悉?

再來看

public void commit() throws HibernateException {
...
try {
if ( session.getFlushMode()!=FlushMode.NEVER ) session.flush();
try {
session.connection().commit();
committed = true;
}
...
toggleAutoCommit();
}

這是提交方法,看到connection().commit() 了嗎?下面就不用我多說了,這個類代碼非常簡單易懂,通過閱讀使我們明白Hibernate的Transaction都在干了些什么?我現在把用Hibernate寫的例子翻譯成JDBC,大家就一目了然了:

Connection conn = ...; <--- session = sf.openSession();

conn.setAutoCommit(false); <--- tx = session.beginTransactioin();

... <--- ...

conn.commit(); <--- tx.commit(); (對應左邊的兩句)
conn.setAutoCommit(true);

conn.close(); <--- session.close();

看明白了吧,Hibernate的JDBCTransaction根本就是conn.commit而已,根本毫無神秘可言,只不過在Hibernate中,Session打開的時候,就會自動conn.setAutoCommit(false),不像一般的JDBC,默認都是true,所以你最后不寫commit也沒有關系,由于Hibernate已經把AutoCommit給關掉了,所以用Hibernate的時候,你在程序中不寫Transaction的話,數據庫根本就沒有反應。

二、JTATransaction

假如你在EJB中使用Hibernate,或者預備用JTA來治理跨Session的長事務,那么就需要使用JTATransaction,先看一個例子:

javax.transaction.UserTransaction tx = new InitialContext().lookup("javax.transaction.UserTransaction");

Session s1 = sf.openSession();
...
s1.flush();
s1.close();

...

Session s2 = sf.openSession();
...
s2.flush();
s2.close();

tx.commit();

這是標準的使用JTA的代碼片斷,Transaction是跨Session的,它的生命周期比Session要長。假如你在EJB中使用Hibernate,那么是最簡單不過的了,你什么Transaction代碼統統都不要寫了,直接在EJB的部署描述符上配置某某方法是否使用事務就可以了。

現在我們來分析一下JTATransaction的源代碼, net.sf.hibernate.transaction.JTATransaction:

public void begin(InitialContext context, ...
...
ut = (UserTransaction) context.lookup(utName);
...

看清楚了嗎? 和我上面寫的代碼 tx = new Initial Context?().lookup("javax.transaction.UserTransaction"); 是不是完全一樣?

public void commit() ...
...
if (newTransaction) ut.commit();
...

JTATransaction的控制稍微復雜,不過仍然可以很清楚的看出來Hibernate是如何封裝JTA的Transaction代碼的。

但是你現在是否看到了什么問題? 仔細想一下,Hibernate Transaction是從Session中獲得的,tx = session.beginTransaction(),最后要先提交tx,然后再session.close,這完全符合JDBC的Transaction的操作順序,但是這個順序是和JTA的Transactioin操作順序徹底矛盾的!!! JTA是先啟動Transaction,然后啟動Session,關閉Session,最后提交Transaction,因此當你使用JTA的Transaction的時候,那么就千萬不要使用Hibernate的Transaction,而是應該像我上面的JTA的代碼片斷那樣使用才行。

總結:
1、在JDBC上使用Hibernate

必須寫上Hibernate Transaction代碼,否則數據庫沒有反應。此時Hibernate的Transaction就是Connection.commit而已

2、在JTA上使用Hibernate

寫JTA的Transaction代碼,不要寫Hibernate的Transaction代碼,否則程序會報錯

3、在EJB上使用Hibernate

什么Transactioin代碼都不要寫,在EJB的部署描述符里面配置

---CMT(Container Managed Transaction)

---BMT(Bean Managed Transaction)

----JDBC Transaction

----JTA Transaction


--------------------------------------------------------------------------------

提問:

javax.transaction.UserTransaction tx = new InitialContext().lookup("javax.transaction.UserTransaction");

Session s1 = sf.openSession();
...
s1.flush();
s1.close();

...

Session s2 = sf.openSession();
...
s2.flush();
s2.close();

tx.commit();

s1不關閉,使用s2進行操作的代碼中使用s1可不可以(我覺得這樣更加節約資源,不需要反復的連接、關閉)

但sf.opengSession()時,并沒有setAutoCommit(false),我想問的是,假如不編寫任何事務代碼,如:
Session s = sf.openSession();
......
s.close();
數據庫會不會有反應(此時應該是默認AutoCommit為true)。

不會有反應。在sf.openSession() 創建Session實例的時候,就已經調用了conn.setAutoCommit(false)了。

另外,我想問一下:



1. s.flush()是不是必須的

2. s.close()是不是一定要關閉




--------------------------------------------------------------------------------

回答:

s.flush不是必須的,s.close()會調用一次s.flush()

s.close()正常情況下應該關閉,除非你是用ThreadLocal治理Session。

s1不關閉,使用s2進行操作的代碼中使用s1可不可以(我覺得這樣更加節約資源,不需要反復的連接、關閉)

在這個例子中看不出來JTA的作用。
假設
Class A {
find() {
Session s1 = sf.openSession();
...
s1.flush();
s1.close();
}
}


Class B {
find() {
Session s2 = sf.openSession();
...
s2.flush();
s2.close();
}
}

Main {

tx = ...;
A.find();
B.find();
tx.commit();
}

看明白了嗎?JTA的Transaction治理是跨類調用的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
中文字幕精品亚洲| 亚洲免费中文字幕| 亚洲欧美999| 一级一片免费视频| 久久久久久99精品| 欧美日韩一区二区在线视频| 一级日本免费的| 久草视频观看| 精品在线99| 91精品日本| 一区二区三区在线播放欧美 | 国产欧美日韩在线看| 日韩国产欧美亚洲| 91av久久久| 欧美日韩国产成人| 欧美 日韩 国产 在线观看| 国产123在线| 国产日韩中文在线| 日韩精品视频中文在线观看| 日韩视频在线观看一区| 久久精品网站免费观看| 国产www在线观看| 亚洲综合日韩欧美| 中文精品视频| 亚洲成在线观看| 人成在线免费视频| 精品久久人人做人人爽| 在线视频不卡一区二区| 国产福利三区| 视频一区不卡| 日韩免费视频一区| 国产小视频免费在线观看| 欧美日韩视频免费播放| 日韩欧美国产网站| 国产日韩综合| 一区二区三区精品久久久| 精品全国在线一区二区| 欧美日韩999| www.久久草| 精品国产91乱高清在线观看| 一本一道久久a久久精品综合蜜臀| 久久精品国产2020观看福利| 午夜亚洲一区| 日韩欧美中文字幕视频| 一区二区视频在线| √新版天堂资源在线资源| 91精品国产全国免费观看 | 久久久另类综合| 亚洲高清精品视频| 日韩在线视频免费观看高清中文| 亚欧成人精品| 国产手机视频一区二区| 国产黄色片大全| 亚洲一区三区在线观看| 亚洲成年人影院在线| 中文字幕2020第一页| 午夜国产福利一区二区| 99久久久精品免费观看国产 | 日韩亚洲一区中文字幕| 中文网丁香综合网| 欧美日韩国产区| 日本a口亚洲| 欧美日韩在线三级| 精品网站999| 在线视频你懂得一区| 日韩欧美一级精品久久| 国产一区在线精品| 午夜伦欧美伦电影理论片| 亚洲日本欧美日韩高观看| 69堂精品视频在线播放| 日韩综合精品| 日韩中文字幕在线一区| 欧美不卡一二三| 日韩精品在线看| 日韩精品三级| 二区中文字幕| 日韩精品在线网站| 欧美日韩国产在线| 天天摸日日摸狠狠添| 成人久久久久| 亚洲欧美99| 午夜成人鲁丝片午夜精品| 欧美日韩激情在线一区二区三区 | 一级特黄大欧美久久久| 中文字幕一区不卡| 日韩不卡高清视频| 中文字幕精品国产| 日本视频久久久| 日韩欧美在线精品| 国产区日韩欧美| 91欧美日韩在线| 91精品国产综合久久精品app| 91精品网站| 中文字幕视频在线观看| 中文字幕精品在线视频| 欧美日韩三级视频| 99色在线视频| 精品婷婷伊人一区三区三| 91国内精品在线视频| 欧美日韩中文在线| 欧美日韩亚洲国产综合| 99综合精品久久| 精品成人久久av| 日韩精品资源二区在线| 天堂中文在线视频| 在线看的av| 精品熟女一区二区三区| 国产欧美综合在线| 在线中文字幕视频观看| 天天综合天天做| 91精品在线观看国产| 国产小视频在线观看免费| 欧美日韩色综合| 一区二区精品| 中文字幕在线看视频国产欧美| 国产福利一区二区| 久久99精品久久久久子伦| 日韩欧美中文字幕精品| 成人ww免费完整版在线观看| 91精品国产91久久久久青草| 交视频在线观看国产| 国产精久久久久| 91精品国产综合久久久久久| 亚洲三级免费看| 一本大道一区二区三区| 成人a在线观看| 91精品国产色综合久久不卡蜜臀 | 亚洲 国产 欧美 日韩| 91精品国产综合久久久蜜臀粉嫩| 高清中文字幕在线| 国产黄色高清在线| 欧美中文字幕精品| xxxxx性| 亚洲一区不卡在线| 欧美日韩亚洲一| 中文字幕亚洲一区在线观看| 成人福利一区| 精品国产欧美成人夜夜嗨| 欧美成人二区| 久久久久蜜桃| 精品人妻一区二区免费视频| 久久久综合av| 亚洲一区在线观看网站| 国产三级在线观看视频| 一级片免费在线| 欧美日韩国产免费观看| 精品日本视频| 精品久久久精品| 欧美熟妇乱码在线一区| 欧美在线视频第一页| 日韩在线欧美| 久久人人88| 欧美在线亚洲一区| 中文字幕 亚洲一区| 日韩国产欧美在线视频| 欧美日韩高清| 精品视频1区2区3区| 欧美中文字幕第一页| 国产羞羞视频在线播放| 91精品国产综合久久久久久| 久久精品国产2020观看福利| 久久人人88| 日韩精品三级| 国产丝袜在线播放| 亚洲大片精品永久免费| 日韩欧美三级视频| 在线国产99| 精品午夜av| 中文字幕日韩亚洲| 精品乱人伦一区二区三区| 三级网站免费观看| 亚洲欧美伊人| 91www成人久久| 91精品国产网站| 一本久久a久久精品亚洲| 日韩欧美亚洲视频| 国产欧美日韩91| 国产欧美日韩中文久久| 一级片免费在线| 高清1区2区| 国产视频三级在线观看播放| 日韩精品视频在线观看视频| 日韩午夜中文字幕| 国产一区日韩| 亚洲视频色图| 日韩精品免费观看视频 | 91精品国产综合久久久久久漫画 | 在线欧美一级视频| 国产绿帽一区二区三区| 国产香蕉精品视频| 精品国产综合久久| 大香一本蕉伊线亚洲网| 欧美日韩在线视频免费观看 | 一区二区日韩av| 中文字幕狠狠干| 蜜桃视频中文字幕| 欧美日韩在线观看一区| 中文字幕第一页在线播放| 欧美一级欧美三级在线观看| 亚洲黄色片在线观看| 精品日韩一区二区三区免费视频| 亚洲免费中文字幕| 日韩免费视频一区| 欧美日韩国产中字| 在线观看国产一区| 51精品免费网站| 欧美日韩高清一区二区不卡| av免费在线观看网址| 精品欧美日韩精品| 欧美久久在线| 在线观看91精品国产入口| 日韩欧美不卡| 日韩精品在线免费观看视频| 在线观看免费国产小视频| 日韩中文字幕亚洲| 欧美 日韩 国产 在线观看| 国产不卡精品在线| 日韩欧美中文字幕一区| 一区二区三区在线|网站| 蜜桃视频一日韩欧美专区| 欧美日韩色综合| 成人福利一区| 精品在线一区二区| 成人欧美亚洲| 亚洲专区一二三| 一区二区三区视频网站| 国产福利免费在线观看| 不卡视频一区二区| aaa大片在线观看| 久久夜色精品国产噜噜亚洲av| 欧美日韩高清| 国产欧美日韩第一页| 精品久久久三级| 欧美三级日韩三级| 欧美日韩久久久| 精品视频在线视频| 91精品久久久久久久91蜜桃| 久久久精品网| 日韩专区视频网站| 婷婷综合福利| 精品极品三级久久久久| 中文字幕 欧美日韩| 欧美午夜精品在线| 欧美日韩亚洲天堂| 欧美日韩视频免费播放| 亚洲一区资源| 久久电影国产免费久久电影| 国产福利在线看| 久久久精品网| 国产在线黄色片| 中文字幕在线视频精品| 欧美日韩999| 中文字幕在线国产| 日韩午夜黄色| 中文精品视频| 色欧美日韩亚洲| 一区二区在线观看不卡| 亚洲综合日韩中文字幕v在线| 日韩中文在线视频| a视频免费在线观看| 国产中文在线观看| 成人无遮挡免费网站视频在线观看| 成人xxxx| 日韩免费电影网站| 亚洲va韩国va欧美va精品| 亚洲免费观看在线观看| 国产欧美日韩在线观看| 日本精品福利视频| 日韩av综合在线观看| 日韩在线不卡一区| 日韩精品―中文字幕| 欧美日中文字幕| 国产欧美日韩在线看| 一区二区日韩免费看| 久久久久久欧美| 国产视频中文字幕| 日韩专区中文字幕| 欧美人妻一区二区三区| 欧美日韩国产综合视频在线观看中文| 高清在线一区| 99亚洲视频| 国自产拍在线网站网址视频| 国产成人精品网址| 欧美日韩综合在线| 中文字幕中文字幕精品| 日韩久久在线| 国产字幕在线看| 日韩午夜高潮| 亚洲一级网站| 日韩精品中文在线观看| 亚洲高清免费一级二级三级| 粉嫩喷白浆久久| 中文字幕日韩欧美| 日韩欧美国产黄色| 日韩欧美视频一区二区三区四区| 欧美 日韩 中文字幕| 精品日本视频| 国产欧美日韩在线视频| 91久久久精品国产| 国产黄色一级片| 精品一二三四区| 亚亚洲欧洲精品| 亚洲一区资源| 亚洲成av人片在线| 在线视频三区| 欧美日韩久久不卡| 国产福利第一页| 91精品国产色综合久久久蜜香臀| 国产95在线|亚洲| 欧美国产三级| 亚洲国产无线乱码在线观看 | 国产91久久久久| 国产成人精品三级| 亚洲精华国产欧美| 91精品久久久久久久久| 亚洲欧美久久234| 日韩高清不卡| 国产精品一区二三区| 日韩wumaV| 在线一区二区三区精品| 日韩在线不卡| 亚洲 欧美综合在线网络| 国产福利免费在线观看| 免费高清特黄a大片| 91午夜在线| 久久精品www| 中文字幕日韩国产| 在线免费91| 97视频在线| 精品日韩在线观看| va中文字幕| 日韩亚洲欧美中文高清在线| 国产www.大片在线| 色99中文字幕| 欧美日韩中文字幕日韩欧美| 中文字幕日韩欧美| 亚洲第一网中文字幕| 日韩精品视频在线播放| 精品在线99| 欧美日韩在线精品成人综合网| 日韩欧美在线第一页| aaa欧美日韩| 国产一区深夜福利| 在线视频三区| av免费在线网站| av免费在线播放| 91蜜桃婷婷狠狠久久综合9色| www.老鸭窝.com| 国产欧美日韩不卡| 中文字幕欧美亚洲| 日韩欧美中文字幕精品| 国产在线观看黄色| 国产日韩av高清| 精品久久久久久无| 久久精品最新免费国产成人| 国产在线不卡av| 日韩色在线观看| 欧美日韩亚洲系列| 亚洲成av人片一区二区密柚| 日韩高清在线不卡| 色综合婷婷久久| 日韩精品视频免费在线观看| 日韩精品丝袜在线| 日韩精品视频在线免费观看| 国产欧美中文在线| 亚洲综合在线不卡| 一级片免费网站| 精品成a人在线观看| 激情婷婷亚洲| 日韩欧美999| 国产九九在线| 国产亚洲欧美色| 午夜av一区二区| 另类专区欧美| 91吃瓜在线观看| 亚洲中文字幕一区| 中文字幕在线官网| 国产资源中文字幕| 国产成人精品999| 欧美久久久久久蜜桃| 天堂精品高清1区2区3区| 国产成人精品999| 日韩欧美国产成人一区二区| 蜜臀91精品国产高清在线观看| 一二三区精品福利视频| 日韩欧美国产黄色| 欧美日韩国产综合网| 在线视频不卡一区二区| 精品视频资源站| 日韩精品一页| 日韩国产高清一区| 国产欧美日韩精品高清二区综合区| 国内精品99| 视频一区日韩| 日韩中文字幕精品视频| av免费网站在线观看| 日韩欧美在线综合网| www.狠狠干| 中文在线第一页| 国产欧美日韩综合|