熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Hibernate 基於JDBC的事務[3]

2022-06-13   來源: Java開源技術 

  Java代碼

public class ClassA{   
public void saveUser(User user){   
session = sessionFactoryopenSession();   
Transaction tx = sessionbeginTransaction();   
sessionsave(user);   
txcommit();   
sessionclose();   
}   
}   
public class ClassB{   
public void saveOrder(Order order){   
session = sessionFactoryopenSession();   
Transaction tx = sessionbeginTransaction();   
sessionsave(order);   
txcommit();   
sessionclose();   
}   
}   
public class ClassC{   
public void save(){   
……   
UserTransaction tx = new InitialContext()lookup(……);   
ClassAsave(user);   
ClassBsave(order);   
txcommit();   
……   
}   

public class ClassA{
public void saveUser(User user){
session = sessionFactoryopenSession();
Transaction tx = sessionbeginTransaction();
sessionsave(user);
txcommit();
sessionclose();
}
}
public class ClassB{
public void saveOrder(Order order){
session = sessionFactoryopenSession();
Transaction tx = sessionbeginTransaction();
sessionsave(order);
txcommit();
sessionclose();
}
}
public class ClassC{
public void save(){
……
UserTransaction tx = new InitialContext()lookup(……);
ClassAsave(user);
ClassBsave(order);
txcommit();
……
}

  這裡有兩個類ClassA和ClassB分別提供了兩個方法saveUsersaveOrder 用於保存用戶信息和訂單信息在ClassC中我們接連調用了ClassAsaveUser方法和ClassBsaveOrder 方法同時引入了JTA 中的UserTransaction 以實現ClassCsave方法中的事務性問題出現了ClassA 和ClassB 中分別都調用了Hibernate 的Transaction 功能在Hibernate 的JTA 封裝中SessionbeginTransaction 同樣也執行了InitialContextlookup方法獲取UserTransaction實例Transactioncommit方法同樣也調用了UserTransactioncommit方法實際上這就形成了兩個嵌套式的JTA TransactionClassC 申明了一個事務而在ClassC 事務周期內ClassA 和ClassB也企圖申明自己的事務這將導致運行期錯誤因此如果決定采用JTA Transaction應避免再重復調用Hibernate 的 Transaction功能上面的代碼修改如下

[]  []  []  []  []  


From:http://tw.wingwit.com/Article/program/Java/ky/201311/29039.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.