亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Hibernate入門 - Transaction

2019-11-18 13:56:26
字體:
供稿:網(wǎng)友

  Hibernate是對(duì)JDBC的輕量級(jí)對(duì)象封裝,Hibernate本身是不具備Transaction處理功能的,Hibernate的Transaction實(shí)際上是底層的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

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

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

將使用JTATransaction

不管你預(yù)備讓Hibernate使用JDBCTransaction,還是JTATransaction,我的忠告就是什么都不配,將讓它保持默認(rèn)狀態(tài),如下:

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

在下面的分析中我會(huì)給出原因。

一、JDBC Transaction

看看使用JDBC Transaction的時(shí)候我們的代碼例子:

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

這是默認(rèn)的情況,當(dāng)你在代碼中使用Hibernate的Transaction的時(shí)候?qū)嶋H上就是JDBCTransaction。那么JDBCTransaction究竟是什么東西呢?來看看源代碼就清楚了:

Hibernate2.0.3源代碼中的類

net.sf.hibernate.transaction.JDBCTransaction:

public void begin() throws HibernateException {

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

這是啟動(dòng)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() 了嗎?下面就不用我多說了,這個(gè)類代碼非常簡(jiǎn)單易懂,通過閱讀使我們明白Hibernate的Transaction都在干了些什么?我現(xiàn)在把用Hibernate寫的例子翻譯成JDBC,大家就一目了然了:

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

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

... <--- ...

conn.commit(); <--- tx.commit(); (對(duì)應(yīng)左邊的兩句)
conn.setAutoCommit(true);

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

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

二、JTATransaction

假如你在EJB中使用Hibernate,或者預(yù)備用JTA來治理跨Session的長(zhǎng)事務(wù),那么就需要使用JTATransaction,先看一個(gè)例子:

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();

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

現(xiàn)在我們來分析一下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的控制稍微復(fù)雜,不過仍然可以很清楚的看出來Hibernate是如何封裝JTA的Transaction代碼的。

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

總結(jié):
1、在JDBC上使用Hibernate

必須寫上Hibernate Transaction代碼,否則數(shù)據(jù)庫沒有反應(yīng)。此時(shí)Hibernate的Transaction就是Connection.commit而已

2、在JTA上使用Hibernate

寫JTA的Transaction代碼,不要寫Hibernate的Transaction代碼,否則程序會(huì)報(bào)錯(cuò)

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不關(guān)閉,使用s2進(jìn)行操作的代碼中使用s1可不可以(我覺得這樣更加節(jié)約資源,不需要反復(fù)的連接、關(guān)閉)

但sf.opengSession()時(shí),并沒有setAutoCommit(false),我想問的是,假如不編寫任何事務(wù)代碼,如:
Session s = sf.openSession();
......
s.close();
數(shù)據(jù)庫會(huì)不會(huì)有反應(yīng)(此時(shí)應(yīng)該是默認(rèn)AutoCommit為true)。

不會(huì)有反應(yīng)。在sf.openSession() 創(chuàng)建Session實(shí)例的時(shí)候,就已經(jīng)調(diào)用了conn.setAutoCommit(false)了。

另外,我想問一下:



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

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




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

回答:

s.flush不是必須的,s.close()會(huì)調(diào)用一次s.flush()

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

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

在這個(gè)例子中看不出來JTA的作用。
假設(shè)
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治理是跨類調(diào)用的。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
av成人老司机| 久久先锋资源网| 国产激情片在线观看| 久久aaaa片一区二区| 亚洲风情亚aⅴ在线发布| 丰满人妻老熟妇伦人精品| 福利社在线免费视频| 欧洲av一区二区嗯嗯嗯啊| а√在线中文网新版地址在线| gogo高清在线播放免费| 中文字幕久久精品一区二区| 中文字幕人妻无码系列第三区| 欧美精彩一区二区三区| 肉丝美足丝袜一区二区三区四| wwwwww在线观看| 白白色视频在线| 日韩男人的天堂| 小说区图片区综合久久88| 亚洲国产精彩中文乱码av在线播放| 国产一区二区三区不卡在线| 亚洲国产精品一区二区久| 久久99国产精品久久| 日韩精品亚洲一区二区三区免费| 国产高清在线精品一区二区三区| 国产精品igao视频网网址不卡日韩| 精品国产午夜| 国产精品护士白丝一区av| 精品国产一区二区三区四| 91超碰国产在线| 欧美电影免费| 国产精品一区二区三区久久| 欧美a级一区二区| 91九色国产在线| 久久69国产一区二区蜜臀| 捆绑调教日本一区二区三区| 亚洲精品国产久| 中文字幕被公侵犯的漂亮人妻| 精品国产乱码久久久| 无码免费一区二区三区免费播放| 国语对白永久免费| 亚洲xxx自由成熟| 日本va欧美va国产激情| 麻豆一区二区三区四区精品蜜桃| 亚洲五码在线| 久久人体视频| 国产一区二区三区av在线| 国产视频久久网| 欧美在线观看视频一区二区| 黄色一级在线视频| 欧美96一区二区免费视频| 久久精品视频在线播放| 午夜免费一区| 欧美日韩精品久久久免费观看| 欧美日韩国产首页| 欧美一级日韩不卡播放免费| 国产一区二区中文字幕| 国产伦精品一区二区三区妓女| 成人精品视频一区二区| 可以看美女隐私的网站| 欧洲精品一区二区三区在线观看| 手机在线一区二区三区| 欧美成人精品影院| 日韩中文字幕不卡| 欧美另类变人与禽xxxxx| 欧美videos另类| 久久成人高清| 少妇bbw搡bbbb搡bbbb| 在线视频精品一| 成人欧美一区二区三区黑人一| 猫咪av永久| 成人av电影在线观看| 三级国产在线观看| 先锋资源在线视频| 久青草国产97香蕉在线视频| 欧美高清视频一区二区三区| 欧美国产精品一区| 日本我和搜子同居的日子高清在线| 亚洲白虎美女被爆操| 中文字幕综合在线观看| 91tv官网精品成人亚洲| 久久国产精品99国产| 六月丁香婷婷久久| 亚洲精品电影在线一区| 久久久精品2019中文字幕神马| 国产精品免费aⅴ片在线观看| 国产精品自在线| 日韩av在线网站| 国产成人精品综合久久久久99| 亚洲日产国产精品| 亚洲黄色一区二区| 久久伊人精品视频| 韩国女主播一区二区| 久久久影视精品| 337p粉嫩色噜噜噜大肥臀| 奇米色777欧美一区二区| 爱啪啪综合导航| 色视频www在线播放国产| 青草青草久热精品视频在线网站| 国产av一区二区三区精品| 97人妻精品一区二区三区免费| 国产精品熟女一区二区不卡| 黄色免费网站视频| 一区二区三区在线观看视频| 国产一级视频| 国产欧美精品国产国产专区| 极品在线视频| 精品捆绑调教一区二区三区| 成人h动漫精品一区二区无码| 欧美成人精品不卡视频在线观看| 日韩无码精品一区二区三区| 成人免费在线观看视频网站| 韩日精品在线| 人人妻人人爽人人澡人人精品| 99这里只有精品| 91久久精品一区二区别| 日本在线观看网址| 色综合天天视频在线观看| xxx成人少妇69| 好爽好深好紧好大| 在线黄色的网站| av在线视屏| 久久久久久伊人| 免费在线亚洲欧美| 91精品美女| 国产精品色一区二区三区| 18视频免费网址在线观看| 亚洲免费激情视频| 日韩第一区第二区| 成人91在线| 免费看黄网站在线观看| 国产精品一色哟哟| 老司机一区二区三区| 日韩欧美一中文字暮专区| 丝袜美腿小色网| 亚洲黄色av女优在线观看| 精品剧情v国产在线观看在线| 欧美精品一区免费| 午夜小视频在线观看| 久久93精品国产91久久综合| 毛片在线播放网站| 国产二区视频在线| 成人在线观看你懂的| 久久波多野结衣| 999精品嫩草久久久久久99| 欧美最猛黑人xxxx| 乱熟女高潮一区二区在线| 亚洲系列另类av| 国产精品视频免费在线| 精品99久久久久成人网站免费| 在线毛片网站| 99久久伊人精品| 久久久久久久网站| 嫩模私拍啪啪| 国产成人福利网站| 天天做天天爱夜夜爽| 欧美激情xxxx| 成人乱人伦精品视频在线观看| 青春草在线视频免费观看| 懂色av影视一区二区三区| √新版天堂资源在线资源| 天天看天天干| 色综合天天综合网国产成人综合天| 欧美精品在线观看播放| yellow网站在线观看| 三上亚洲一区二区| 欧美亚洲在线观看| 在线观看你懂的网站| 夜夜嗨aⅴ免费视频| 999在线观看| 30一40一50老女人毛片| 一区二区三区四区免费| 色天天久久综合婷婷女18| 国家队第一季免费高清在线观看| 国产亚洲va综合人人澡精品| av男人天堂网| 久久精品动漫| 一区二区三区亚洲| 九色视频网站在线观看| 伊人婷婷久久| 天堂在线视频播放| 久久久久国产精品www| 欧美mv和日韩mv国产网站| 成人短视频在线观看免费| 日本一级黄色录像| 日韩av电影免费观看高清| 国产午夜精品无码一区二区| 欧美裸体在线版观看完整版| 曰本三级日本三级日本三级| 美日韩丰满少妇在线观看| 国产精品中出一区二区三区| 精品国产乱码久久久久久蜜坠欲下| 亚洲电影欧美电影有声小说| 国产亚洲成av人片在线观看| 久久电影一区二区| 国产精品卡一卡二| а天堂中文最新一区二区三区| 视频在线观看一区| 日本无删减在线| a级免费视频| 国产极品在线播放| 亚洲人成网站777色婷婷| 亚洲成人第一网站| 日韩一区二区视频在线观看| 成人在线手机视频| 伊人成人在线| 岛国91视频| 久久国产综合视频| 免费观看成人www动漫视频| 久久久精品视频成人| 久久久久久久久久久久国产| 欧美 亚欧 日韩视频在线| 日韩少妇内射免费播放18禁裸乳| 成人黄色在线免费| 美女视频在线免费| av在线1区2区| 亚洲手机在线观看| 国产午夜精品一区二区理论影院| 波多野结衣高清视频| 韩国主播福利视频一区二区三区| 精品一区二区综合| 女生裸体视频一区二区三区| 国产精品美女主播在线观看纯欲| h网站在线播放| 99久久免费精品国产72精品九九| 踪合国产第二页| 久久精品国产成人精品| 欧美老**bbbb毛片| 国产精品视频一区麻豆| 日韩一区二区三区在线免费观看| 中文日韩电影网站| 91精品国模一区二区三区| 99综合电影在线视频| 国产精品69久久久| 国产精品国产自产拍高清av| 久久久久天天天天| 中文字幕www| 四虎最新网站| 嫩草嫩草嫩草嫩草| 久久天天躁狠狠躁夜夜躁| 激情综合网五月| 久久这里只精品最新地址| 欧美在线一区二区三区四区| 天天色天天综合网| 成人性生交大免费看| 在线免费观看成人短视频| 黄色视屏网站在线免费观看| 老司机午夜网站| 午夜免费入口| 日韩制服诱惑| 日韩午夜av电影| jlzzjizz在线播放观看| 色婷婷综合视频| 日韩一区二区三区久久| 99国产精品久久久| 亚洲一卡二卡在线观看| 色啪免费观看视频| 亚洲福利国产| 日韩av一区二区在线| 99热这里只有精品7| 欧美一级高潮片| 在线播放精品| 在线观看91视频| 在线观看特色大片免费视频| 超碰在线caoporen| 日本精品久久久久中文字幕| 国产精品自产拍在线网站| 欧美黄色小说| 国产女人被狂躁到高潮小说| 免费亚洲视频| 日本一区二区三区高清不卡| 一级视频在线观看视频在线啦啦| 亚洲黑丝一区二区| 日本黄色小网站| 久久精品最新免费国产成人| 国产美女高潮久久白浆| 91精品国产色综合久久不卡粉嫩| 免费在线观看av电影| 99热在线成人| av资源中文在线天堂| 色婷婷久久久综合中文字幕| 欧美精品一级| 国产精品毛片a∨一区二区三区| 国产福利视频一区二区| 爽成人777777婷婷| 久久噜噜噜精品国产亚洲综合| 国产精品久久中文| 美腿丝袜亚洲一区| 超级碰碰视频| 国产精品300页| 激情网站在线| 国产精品蜜月aⅴ在线| 天堂а√在线官网| 国产精品久久久久aaaa| 日韩午夜激情免费电影| 天天综合国产| 黑人与娇小精品av专区| 亚洲最大黄网| 欧美妇乱xxxxx视频| 欧美日韩国产va另类| 亚洲国产精彩中文乱码av在线播放| 日本成人看片网址| 宅男噜噜噜66国产精品免费| 欧美一区二区免费在线观看| 九九热99久久久国产盗摄| 国产无遮挡又黄又爽免费软件| 亚洲午夜精品久久久中文影院av| 欧美日韩国产在线观看| ,一级淫片a看免费| 亚洲精品电影在线观看| 国产精品久久久网站| 97精品久久久中文字幕免费| 欧美一性一乱一交一视频| 成人www视频在线观看| 免费在线观看污网站| 久久久中精品2020中文| 亚洲91中文字幕无线码三区| 久久精品国产亚洲一区二区三区| 手机成人在线| 成av人电影在线观看| 亚洲男女一区二区三区| 久久久久日韩精品久久久男男| 日本精品久久久久影院| 2020国产成人综合网| 久久精品中文字幕免费mv| 另类欧美日韩国产在线| 国产精选久久久| 在线观看区一区二| 久久久久99精品成人片毛片|