如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
hibernate事务:Hibernate的事务和并发02疯狂代码http://www.crazycoder.cn/ĵ:http:/www.crazycoder.cn/Java/Article53565.html12.2.1.非托管环境如果Hibernat持久层运行在个非托管环境中数据库连接通常由Hibernate连接池机制来处理代码内容session/transaction处理方式如下所示://Non-managedenvironmentidiomSessionsess=factory.openSession;Transactiontx=null;try{tx=sess.beginTransaction;//dosomework...tx.commit;}catch(RuntimeExceptione){(tx!=null)tx.rollback;throwe;//ordisplayerrormessage}finally{sess.close;}你不需要显式flushSession-对commit会自动触发session同步close标志session结束close思路方法重要暗示是session释放了JDBC连接这段Java代码是可移植可以在非托管环境和JTA环境中运行你很可能从未在个标准应用业务代码中见过这样使用方法;致命(系统)异常应该总是在应用“顶层”被捕获换句话说执行Hibernate代码(在持久层)和处理RuntimeException异常代码(通常只能清理和退出应用)应该在区别应用逻辑层这对于你设计自己软件Software系统来说是个挑战只要有可能你就应该使用J2EE/EJB容器服务异常处理将在本章稍后进行讨论请注意你应该选择org.hibernate.transaction.JDBCTransactionFactory(这是默认选项).12.2.2.使用JTA如果你持久层运行在个应用服务器中(例如在EJBsessionbeans后面)Hibernate获取每个数据源连接将自动成为全局JTA事务部分Hibernate提供了两种策略进行JTA集成如果你使用bean管理事务(BMT)可以通过使用HibernateTransactionAPI来告诉应用服务器启动和结束BMT事务因此事务管理代码和在非托管环境下是样代码内容//BMTidiomSessionsess=factory.openSession;Transactiontx=null;try{tx=sess.beginTransaction;//dosomework...tx.commit;}catch(RuntimeExceptione){(tx!=null)tx.rollback;throwe;//ordisplayerrormessage}finally{sess.close;}在CMT方式下事务声明是在sessionbean部署描述符中而不需要编程除非你设置了属性hibernate.transaction.flush_before_completion和hibernate.transaction.auto_close_session为true否则你必须自己同步和关闭SessionHibernate可以为你自动同步和关闭Session你唯要做就是当发生异常时进行事务回滚幸运是在个CMTbean中事务回滚甚至可以由容器自动进行由sessionbean思路方法抛出未处理RuntimeException异常可以通知容器设置全局事务回滚这意味着在CMT中你完全无需使用HibernateTransactionAPI请注意当你配置Hibernate事务工厂时候在个BMTsessionbean中你应该选择org.hibernate.transaction.JTATransactionFactory在个CMTsessionbean中选择org.hibernate.transaction.CMTTransactionFactory记住同时也要设置org.hibernate.transaction.manager_lookup_如果你使用CMT环境并且让容器自动同步和关闭session你可能也希望在你代码区别部分使用同个session般来说在个非托管环境中你可以使用个ThreadLocal变量来持有这个session但是单个EJB思路方法可能会在区别线程中执行(举例来说个sessionbean另个sessionbean)如果你不想在应用代码中被传递Session对象例子问题困扰话那么SessionFactory提供ge