国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
hibernate-事務管理
Hibernate 是JDBC 的輕量級封裝,本身并不具備事務管理能力。在事務管理層,
Hibernate將其委托給底層的JDBC或者JTA,以實現(xiàn)事務管理和調度功能。
Hibernate的默認事務處理機制基于JDBC Transaction。我們也可以通過配置文
件設定采用JTA作為事務管理實現(xiàn):
Java代碼
  1. <hibernate-configuration>   
  2. <session-factory>   
  3. ……   
  4. <property name="hibernate.transaction.factory_class">   
  5. net.sf.hibernate.transaction.JTATransactionFactory   
  6. <!--net.sf.hibernate.transaction.JDBCTransactionFactory-->   
  7. </property>   
  8. ……   
  9. </session-factory>   
  10. </hibernate-configuration>  

基于JDBC的事務管理將事務管理委托給JDBC 進行處理無疑是最簡單的實現(xiàn)方式,Hibernate 對于JDBC事務的封裝也極為簡單。
我們來看下面這段代碼:
Java代碼
  1. session = sessionFactory.openSession();   
  2. Transaction tx = session.beginTransaction();   
  3. ……   
  4. tx.commit();  

從JDBC層面而言,上面的代碼實際上對應著:
Java代碼
  1. Connection dbconn = getConnection();   
  2. dbconn.setAutoCommit(false);   
  3. ……   
  4. dbconn.commit();  

就是這么簡單,Hibernate并沒有做更多的事情(實際上也沒法做更多的事情),只是將這樣的JDBC代碼進行了封裝而已。
這里要注意的是,在sessionFactory.openSession()中,hibernate會初始化數(shù)據(jù)庫連接,與此同時,將其AutoCommit 設為關閉狀態(tài)(false)。而其后,在Session.beginTransaction 方法中,Hibernate 會再次確認Connection 的AutoCommit 屬性被設為關閉狀態(tài)( 為了防止用戶代碼對session 的Connection.AutoCommit屬性進行修改)。
這也就是說,我們一開始從SessionFactory獲得的session,其自動提交屬性就已經(jīng)被關閉(AutoCommit=false),下面的代碼將不會對數(shù)據(jù)庫產(chǎn)生任何效果:
Java代碼
  1. session = sessionFactory.openSession();   
  2. session.save(user);   
  3. session.close();  

這實際上相當于 JDBC Connection的AutoCommit屬性被設為false,執(zhí)行了若干JDBC操作之后,沒有調用commit操作即將Connection關閉。如果要使代碼真正作用到數(shù)據(jù)庫,我們必須顯式的調用Transaction指令:
Java代碼
  1. session = sessionFactory.openSession();   
  2. Transaction tx = session.beginTransaction();   
  3. session.save(user);   
  4. tx.commit();   
  5. session.close();  

基于JTA的事務管理
JTA 提供了跨Session 的事務管理能力。這一點是與JDBC Transaction 最大的差異。
JDBC事務由Connnection管理,也就是說,事務管理實際上是在JDBC Connection中實現(xiàn)。事務周期限于Connection的生命周期之類。同樣,對于基于JDBC Transaction的Hibernate 事務管理機制而言,事務管理在Session 所依托的JDBC Connection中實現(xiàn),事務周期限于Session的生命周期。
JTA 事務管理則由 JTA 容器實現(xiàn),JTA 容器對當前加入事務的眾多Connection 進
行調度,實現(xiàn)其事務性要求。JTA的事務周期可橫跨多個JDBC Connection生命周期。
同樣對于基于JTA事務的Hibernate而言,JTA事務橫跨可橫跨多個Session。
JTA 事務是由JTA Container 維護,而參與事務的Connection無需對事務管理進行干涉。這也就是說,如果采用JTA Transaction,我們不應該再調用HibernateTransaction功能。
上面基于JDBC Transaction的正確代碼,這里就會產(chǎn)生問題:
Java代碼
  1. public class ClassA{   
  2. public void saveUser(User user){   
  3. session = sessionFactory.openSession();   
  4. Transaction tx = session.beginTransaction();   
  5. session.save(user);   
  6. tx.commit();   
  7. session.close();   
  8. }   
  9. }   
  10. public class ClassB{   
  11. public void saveOrder(Order order){   
  12. session = sessionFactory.openSession();   
  13. Transaction tx = session.beginTransaction();   
  14. session.save(order);   
  15. tx.commit();   
  16. session.close();   
  17. }   
  18. }   
  19. public class ClassC{   
  20. public void save(){   
  21. ……   
  22. UserTransaction tx = new InitialContext().lookup(“……”);   
  23. ClassA.save(user);   
  24. ClassB.save(order);   
  25. tx.commit();   
  26. ……   
  27. }   
  28. }  
這里有兩個類ClassA和ClassB,分別提供了兩個方法:saveUsersaveOrder,
用于保存用戶信息和訂單信息。在ClassC中,我們接連調用了ClassA.saveUser方法和ClassB.saveOrder 方法,同時引入了JTA 中的UserTransaction 以實現(xiàn)ClassC.save方法中的事務性。問題出現(xiàn)了,ClassA 和ClassB 中分別都調用了Hibernate 的Transaction 功能。在Hibernate 的JTA 封裝中,Session.beginTransaction 同樣也執(zhí)行了InitialContext.lookup方法獲取UserTransaction實例,Transaction.commit方法同樣也調用了UserTransaction.commit方法。實際上,這就形成了兩個嵌套式的JTA Transaction:ClassC 申明了一個事務,而在ClassC 事務周期內,ClassA 和ClassB也企圖申明自己的事務,這將導致運行期錯誤。因此,如果決定采用JTA Transaction,應避免再重復調用Hibernate 的
Transaction功能,上面的代碼修改如下:
Java代碼
  1. public class ClassA{   
  2. public void save(TUser user){   
  3. session = sessionFactory.openSession();   
  4. session.save(user);   
  5. session.close();   
  6. }   
  7. ……   
  8. }   
  9. public class ClassB{   
  10. public void save (Order order){   
  11. session = sessionFactory.openSession();   
  12. session.save(order);   
  13. session.close();   
  14. }   
  15. ……   
  16. }   
  17. public class ClassC{   
  18. public void save(){   
  19. ……   
  20. UserTransaction tx = new InitialContext().lookup(“……”);   
  21. classA.save(user);   
  22. classB.save(order);   
  23. tx.commit();   
  24. ……   
  25. }   
  26. }  

上面代碼中的ClassC.save方法,也可以改成這樣:
Java代碼
  1. public class ClassC{   
  2. public void save(){   
  3. ……   
  4. session = sessionFactory.openSession();   
  5. Transaction tx = session.beginTransaction();   
  6. classA.save(user);   
  7. classB.save(order);   
  8. tx.commit();   
  9. ……   
  10. }   
  11. }  

實際上,這是利用Hibernate來完成啟動和提交UserTransaction的功能,但這樣的做法比原本直接通過InitialContext獲取UserTransaction 的做法消耗了更多的資源,得不償失。
在EJB 中使用JTA Transaction 無疑最為簡便,我們只需要將save 方法配置為JTA事務支持即可,無需顯式申明任何事務,下面是一個Session Bean的save方法,它的事務屬性被申明為“Required”,EJB容器將自動維護此方法執(zhí)行過程中的事務:
Java代碼
  1. /**  
  2. * @ejb.interface-method  
  3. * view-type="remote"  
  4. *  
  5. * @ejb.transaction type = "Required"  
  6. **/  
  7. public void save(){   
  8. //EJB環(huán)境中,通過部署配置即可實現(xiàn)事務申明,而無需顯式調用事務   
  9. classA.save(user);   
  10. classB.save(log);   
  11. }//方法結束時,如果沒有異常發(fā)生,則事務由EJB容器自動提交。  
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
詳解Hibernate Session & Transaction
Hibernate入門之事務管理
getCurrentSession 與 openSession() 的區(qū)別
current_session_context_class的意思和管理SESSION
hibernate知識點理解(轉)
openSession()和getCurrentSession()區(qū)別——hibernate
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服