大家好,Banq,请教EJB事务 2006-07-19 xysniper 你们好,我现在业务层用session bean,DAO层用HIBERNATE现在问题是:SESSION BEAN本身有事务,HIBERNATE操作也有事务,请问DAO中的DB操作事务是由谁的事务来控制的? 第一:如果是HIBERNATE的事务,则EJB的事务做什么用? 第二:如果是EJB的事务控制,则HIBERNATE的事务做什么用?
wind13 2007-04-20 14:19 正好我也有这方面的问题,想再明确一下。我现在用Jdon框架,在DAO的实现里CRUD时,应该是用了Hibernate的事务吧,比如Transaction tx=session.beginTransaction();....tx.commit();这样,那现在是在Service的实现中,如何实现多个操作的事务控制?可以用JTA吗? 可以嵌套这两种事务吗? 是不是象下面这样?奇怪的是怎么要处理这么多异常啊?是不是我做错了什么? [该贴被wind13于2007年04月20日 14:22修改过]
wind13 2007-04-20 14:20 是不是象下面这样?奇怪的是怎么要处理这么多异常啊?是不是我做错了什么? UserTransaction tx = null; Context ctx; try { ctx = new InitialContext(); tx = (UserTransaction)ctx.lookup("javax.transaction.UserTransaction"); tx.begin(); // 此处执行DAO中的操作,在DAO的实现中又有上面提到的hibernate事务处理。 someDao.createSome(someModel); someModel.setValue(newValue); someDao.updateSome(someModel); tx.commit(); } catch (NamingException e) { e.printStackTrace(); rollbackTransaction(tx); } catch (NotSupportedException e) { e.printStackTrace(); rollbackTransaction(tx); } catch (SystemException e) { e.printStackTrace(); rollbackTransaction(tx); } catch (SecurityException e) { e.printStackTrace(); rollbackTransaction(tx); } catch (IllegalStateException e) { e.printStackTrace(); rollbackTransaction(tx); } catch (RollbackException e) { e.printStackTrace(); rollbackTransaction(tx); } catch (HeuristicMixedException e) { e.printStackTrace(); rollbackTransaction(tx); } catch (HeuristicRollbackException e) { e.printStackTrace(); rollbackTransaction(tx); }// 这里把回滚的操作抽成方法了,要不代码更多。 private void rollbackTransaction(UserTransaction tx) { if(tx != null){ try { tx.rollback(); } catch (IllegalStateException e1) { e1.printStackTrace(); } catch (SecurityException e1) { e1.printStackTrace(); } catch (SystemException e1) { e1.printStackTrace(); } } }奇怪的是怎么要处理这么多异常啊?是不是我做错了什么?[该贴被wind13于2007年04月20日 14:22修改过]
diamondsong 2007-04-20 21:28 在ejb中调用hibernate访问数据库,事务是由ejbcmt管理的ejb事务的配置在xml文件中,在ejb中就不需要UserTransaction在使用JTA了,一个事务中可以包含N个事务,事务中的事务可以指定事务边界,设定是否参与其他事务还是独立事务。ejb调用hibernate需要刷新当前数据库session。因为如果利用ejb的cmt管理事务,hibernate的session自动提交会有问题。所以需要在dao调用后调用来刷新当前hibernate session。
wind13 2007-04-22 11:28 谢谢diamondsong 的回复,不过我说的不是EJB和Hibernate的事务嵌套问题,而是说在用Jdon和Hibernate的事务嵌套时的问题。有没有人用过?是不是象我上面写的代码那样?感觉不太对劲儿似的。