淺談如何直接使用Hibernate
作者:佚名 
  這里介紹如果你是直接使用Hibernate,并手動管理它的session,并手動開啟事務(wù)關(guān)閉事務(wù)的話,完全可以保證你的事務(wù)。
 學(xué)習(xí)Hibernate時,經(jīng)常會遇到直接使用Hibernate問題,這里將介紹直接使用Hibernate問題的解決方法。
在直接使用Hibernate時,要在事務(wù)結(jié)束的時候,寫上一句:tx.commit(),這個commit()的源碼為:
- public void commit() throws HibernateException {
 - if (!begun) {
 - throw new TransactionException("Transaction not successfully started");
 - }
 - log.debug("commit");
 - if (!transactionContext.isFlushModeNever() && callback) {
 - transactionContext.managedFlush(); // if an exception occurs during
 - // flush, user must call
 - // rollback()
 - }
 - notifyLocalSynchsBeforeTransactionCompletion();
 - if (callback) {
 - jdbcContext.beforeTransactionCompletion(this);
 - }
 - try {
 - commitAndResetAutoCommit();
 - //重點代碼,它的作用是提交事務(wù),并把connection的autocommit屬性恢復(fù)為true
 - log.debug("committed JDBC Connection");
 - committed = true;
 - if (callback) {
 - jdbcContext.afterTransactionCompletion(true, this);
 - }
 - notifyLocalSynchsAfterTransactionCompletion(Status.STATUS_COMMITTED);
 - } catch (SQLException e) {
 - log.error("JDBC commit failed", e);
 - commitFailed = true;
 - if (callback) {
 - jdbcContext.afterTransactionCompletion(false, this);
 - }
 - notifyLocalSynchsAfterTransactionCompletion(Status.STATUS_UNKNOWN);
 - throw new TransactionException("JDBC commit failed", e);
 - } finally {
 - closeIfRequired();
 - }
 - }
 
上面代碼中,commitAndResetAutoCommit()方法的源碼如下:
- private void commitAndResetAutoCommit() throws SQLException {
 - try {
 - jdbcContext.connection().commit();
 - //這段不用說也能理解了
 - } finally {
 - toggleAutoCommit();
 - //這段的作用是恢復(fù)connection的autocommit屬性為true
 - }
 - }
 
上述代碼的toggleAutoCommit()源代碼如下:
- private void toggleAutoCommit() {
 - try {
 - if (toggleAutoCommit) {
 - log.debug("re-enabling autocommit");
 - jdbcContext.connection().setAutoCommit(true);
 - //這行代碼的意義很明白了吧
 - }
 - } catch (Exception sqle) {
 - log.error("Could not toggle autocommit", sqle);
 - }
 - }
 
因此,如果你是直接使用Hibernate,并手動管理它的session,并手動開啟事務(wù)關(guān)閉事務(wù)的話,完全可以保證你的事務(wù)(好像完全是廢話)。
【編輯推薦】
責(zé)任編輯:佚名 
                    來源:
                    blogjava
 














 
 
 
 
 
 
 