📄 manipulating-data.html
字号:
处理异常 </p></li></ul></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="manipulating-data-s13-1"></a>8.10.1. 清洗(Flush)session</h3></div></div><div></div></div><p> 如果你正在使用<tt class="literal">Transaction</tt>API,你就不用担心这个步骤。在事务提交的时候,隐含就会包括这一步。否则,你应该调用<tt class="literal">Session.flush()</tt>来确保你所有的修改都与数据库同步。 </p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="manipulating-data-s13-2"></a>8.10.2. 提交事务</h3></div></div><div></div></div><p> 如果你正在使用Hibernate 的<tt class="literal">Transaction</tt> API,代码类似这样: </p><pre class="programlisting">tx.commit(); // flush the Session and commit the transaction</pre><p> 如果你自行管理JDBC事务,你应该手工对JDBC 连接执行<tt class="literal">commit()</tt>。 </p><pre class="programlisting">sess.flush();sess.connection().commit(); // not necessary for JTA datasource</pre><p> 如果你决定<span class="emphasis"><em>不</em></span>提交你的更改: </p><pre class="programlisting">tx.rollback(); // rollback the transaction</pre><p> 或者: </p><pre class="programlisting">// not necessary for JTA datasource, important otherwisesess.connection().rollback();</pre><p> 如果你回滚了事务,你应该立即关闭和取消当前session,确保Hibernate内部状态的完整性。 </p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="manipulating-data-s13-3"></a>8.10.3. 关闭session</h3></div></div><div></div></div><p> 调用<tt class="literal">Session.close()</tt>就标志这个session进入了尾声。<tt class="literal">close()</tt>主要的含义就是与这个session相关的JDBC连接会被放弃。 </p><pre class="programlisting">tx.commit();sess.close();</pre><pre class="programlisting">sess.flush();sess.connection().commit(); // not necessary for JTA datasourcesess.close();</pre><p> 如果你自行管理连接,<tt class="literal">close()</tt>会返回连接的一个引用,你就可以手工把它关闭,或者返回它到连接池去。其他情况下,<tt class="literal">close()</tt>会把它返回到连接池去。 </p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="manipulating-data-s13-4"></a>8.10.4. 处理异常</h3></div></div><div></div></div><p> 如果<tt class="literal">Session</tt>抛出了一个exception(包括任何<tt class="literal">SQLException</tt>),你应该立刻回滚这个事务,调用<tt class="literal">Session.close)()</tt>来取消这个<tt class="literal">Session</tt>实例。<tt class="literal">Session</tt>中的一些特定方式会确保session<span class="emphasis"><em>不会</em></span>处于一个不稳定不完整的状态。 </p><p> 建议采用下面的异常处理片断: </p><pre class="programlisting">Session sess = factory.openSession();Transaction tx = null;try { tx = sess.beginTransaction(); // do some work ... tx.commit();}catch (Exception e) { if (tx!=null) tx.rollback(); throw e;}finally { sess.close();}</pre><p> 如果你是手工管理JDBC事务的,用下面这段: </p><pre class="programlisting">Session sess = factory.openSession();try { // do some work ... sess.flush(); sess.connection().commit();}catch (Exception e) { sess.connection().rollback(); throw e;}finally { sess.close();}</pre><p> 如果你是从JTA中获得数据源的: </p><pre class="programlisting">UserTransaction ut = .... ;Session sess = factory.openSession();try { // do some work ... sess.flush();}catch (Exception e) { ut.setRollbackOnly(); throw e;}finally { sess.close();}</pre></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="manipulating-data-s15"></a>8.11. 拦截器(Interceptors)</h2></div></div><div></div></div><p> <tt class="literal">Interceptor</tt>接口提供从session到你的应用程序的回调方法,让你的程序可以观察和在持久化对象保存/更改/删除或者装载的时候操作它的属性。一种可能的用途是用来监视统计信息。比如,下面的<tt class="literal">Interceptor</tt>会自动在一个<tt class="literal">Auditable</tt>创建的时候设置其<tt class="literal">createTimestamp</tt>,并且当它被更改的时候,设置其<tt class="literal">lastUpdateTimestamp</tt>属性。 </p><pre class="programlisting">package net.sf.hibernate.test;import java.io.Serializable;import java.util.Date;import java.util.Iterator;import net.sf.hibernate.Interceptor;import net.sf.hibernate.type.Type;public class AuditInterceptor implements Interceptor, Serializable { private int updates; private int creates; public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { // do nothing } public boolean onFlushDirty(Object entity, Seria
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -