📄 transactions.html
字号:
// do some work ... factory.getCurrentSession().getTransaction().commit();}catch (RuntimeException e) { factory.getCurrentSession().getTransaction().rollback(); throw e; // or display error message}</pre><p> 你很可能从未在一个通常的应用程序的业务代码中见过这样的代码片断:致命的(系统)异常应该总是 在应用程序“顶层”被捕获。换句话说,执行Hibernate调用的代码(在持久层)和处理 <tt class="literal">RuntimeException</tt>异常的代码(通常只能清理和退出应用程序)应该在不同 的应用程序逻辑层。Hibernate的当前上下文管理可以极大地简化这一设计,你所有的一切就是<tt class="literal">SessionFactory</tt>。 异常处理将在本章稍后进行讨论。 </p><p> 请注意,你应该选择 <tt class="literal">org.hibernate.transaction.JDBCTransactionFactory</tt> (这是默认选项),对第二个例子来说,<tt class="literal">hibernate.current_session_context_class</tt>应该是<tt class="literal">"thread"</tt> </p></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="transactions-demarcation-jta"></a>11.2.2. 使用JTA</h3></div></div><div></div></div><p> 如果你的持久层运行在一个应用服务器中(例如,在EJB session beans的后面),Hibernate获取 的每个数据源连接将自动成为全局JTA事务的一部分。 你可以安装一个独立的JTA实现,使用它而不使用EJB。Hibernate提供了两种策略进行JTA集成。 </p><p> 如果你使用bean管理事务(BMT),可以通过使用Hibernate的 <tt class="literal">Transaction</tt> API来告诉 应用服务器启动和结束BMT事务。因此,事务管理代码和在非托管环境下是一样的。 </p><pre class="programlisting">// BMT idiomSession sess = factory.openSession();Transaction tx = null;try { tx = sess.beginTransaction(); // do some work ... tx.commit();}catch (RuntimeException e) { if (tx != null) tx.rollback(); throw e; // or display error message}finally { sess.close();}</pre><p> 如果你希望使用与事务绑定的<tt class="literal">Session</tt>,也就是使用<tt class="literal">getCurrentSession()</tt>来简化上下文管理,你将不得不直接使用JTA <tt class="literal">UserTransaction</tt>API。 </p><pre class="programlisting">// BMT idiom with getCurrentSession()try { UserTransaction tx = (UserTransaction)new InitialContext() .lookup("java:comp/UserTransaction"); tx.begin(); // Do some work on Session bound to transaction factory.getCurrentSession().load(...); factory.getCurrentSession().persist(...); tx.commit();}catch (RuntimeException e) { tx.rollback(); throw e; // or display error message}</pre><p> 在CMT方式下,事务声明是在session bean的部署描述符中,而不需要编程。 因此,代码被简化为: </p><pre class="programlisting">// CMT idiomSession sess = factory.getCurrentSession();// do some work...</pre><p> 在CMT/EJB中甚至会自动rollback,因为假若有未捕获的<tt class="literal">RuntimeException</tt>从session bean方法中抛出,这就会通知容器把全局事务回滚。<span class="emphasis"><em>这就意味着,在BMT或者CMT中,你根本就不需要使用Hibernate <tt class="literal">Transaction</tt> API ,你自动得到了绑定到事务的“当前”Session。 </em></span>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -