淺談如何直接使用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