新聞中心
學(xué)習(xí)Hibernate時(shí),經(jīng)常會(huì)遇到直接使用Hibernate問(wèn)題,這里將介紹直接使用Hibernate問(wèn)題的解決方法。

為鉛山等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及鉛山網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站制作、網(wǎng)站建設(shè)、鉛山網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
在直接使用Hibernate時(shí),要在事務(wù)結(jié)束的時(shí)候,寫(xiě)上一句:tx.commit(),這個(gè)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();
- //重點(diǎn)代碼,它的作用是提交事務(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();
- //這段不用說(shuō)也能理解了
- } 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,并手動(dòng)管理它的session,并手動(dòng)開(kāi)啟事務(wù)關(guān)閉事務(wù)的話,完全可以保證你的事務(wù)(好像完全是廢話)。
網(wǎng)站標(biāo)題:淺談如何直接使用Hibernate
本文來(lái)源:http://www.5511xx.com/article/coijhgj.html


咨詢
建站咨詢
