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功能上面的代码修改如下
[] [] [] [] []