溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

為什么用Spring來(lái)管理Hibernate

發(fā)布時(shí)間:2021-10-27 11:01:06 來(lái)源:億速云 閱讀:91 作者:柒染 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)為什么用Spring來(lái)管理Hibernate,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

為什么要用Hibernate框架?

既然用Hibernate框架訪問(wèn)管理持久層,那為何又提到用Spring來(lái)管理以及整合Hibernate呢?

首先我們來(lái)看一下Hibernate進(jìn)行操作的步驟。比如添加用戶(hù)的一個(gè)步驟。在此為了解釋提出的問(wèn)題

看截圖,可以看出,Hibernate操作的步驟如下:

為什么用Spring來(lái)管理Hibernate

  1. 獲得Configuration對(duì)象

  2. 創(chuàng)建SessionFactory

  3. 創(chuàng)建Session

  4. 打開(kāi)事務(wù)

  5. 進(jìn)行持久化操作。比如上面的添加用戶(hù)操作

  6. 提交事務(wù)

  7. 發(fā)生異常,回滾事務(wù)

  8. 關(guān)閉事務(wù)

使用Hibernate進(jìn)行訪問(wèn)持久層,每次都要進(jìn)行這八個(gè)步驟。但是若使用Spring對(duì)Hibernate進(jìn)行管理,又是怎么樣的呢?

首先,Spring對(duì)Hibernate提供了HibernateTemple類(lèi)。這個(gè)模版類(lèi)對(duì)session進(jìn)行封裝。并且Spring會(huì)默認(rèn)為自動(dòng)提交事務(wù)。所在在dao層直接寫(xiě)入this.save(Object)即可。

在實(shí)踐中,遇到了一個(gè)問(wèn)題,無(wú)法插入數(shù)據(jù)庫(kù),經(jīng)過(guò)一番折騰,多次實(shí)驗(yàn),驗(yàn)證,總結(jié)一下原因,結(jié)果如下:

注意:所有的操作都必須在事務(wù)中進(jìn)行。若單純的使用Hibernate,則事務(wù)需要手動(dòng)開(kāi)啟提交關(guān)閉操作。當(dāng)然也可以在Hibernate配置文件中,自動(dòng)提交。

若使用Spring管理Hibernate,則默認(rèn)的是自動(dòng)提交事務(wù)。但是在此,需要注意的是:若使用Spring在配置文件中配置數(shù)據(jù)源而不使用hibernate.cfg.xml,則可以成功插入數(shù)據(jù)庫(kù),因?yàn)镠ibernateTemple默認(rèn)提供自動(dòng)提交事務(wù)。在Spring的配置文件配置數(shù)據(jù)源如下:使用此數(shù)據(jù)源需要的jar如下:commons-dbcp.jar,commons-pool.jar,msbase.jar,mssqlserver.jar, msutil.jar,sqljdbc4.jar;

<bean id="dataSource"  class="org.apache.commons.dbcp.BasicDataSource">      <property name="driverClassName" value="com.microsoft.jdbc.sqlserver.SQLServerDriver"></property>      <property name="url" value="jdbc:sqlserver://192.168.24.176:1433;database=test"></property>      <property name="username" value="sa"></property>      <property name="password" value="123"></property>  </bean>  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">      <property name="dataSource" ref="dataSource"></property>          <!-- hibernate屬性配置 -->      <property name="hibernateProperties">          <props>              <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>              <prop key="hibernate.hbm2ddl.auto">update</prop>          </props>      </property>  !--         如果采用傳統(tǒng)的hbm.xml的方式,可以采用如下方式來(lái)簡(jiǎn)化注冊(cè)hbm.xml的步驟,并且class為L(zhǎng)ocalSessionFactoryBean -->      <property name="mappingLocations">          <list>              <value>classpath:User.hbm.xml</value>          </list>      </property>  </bean>

若Spring中不是直接配置數(shù)據(jù)源,而是使用hibernate.cfg.xml,則是無(wú)法若直接this.save(Object),則無(wú)法插入數(shù)據(jù)庫(kù)中,但是可以保存中緩存中。因?yàn)樗械牟僮鞫际窃谑聞?wù)中執(zhí)行的,而hibernate.cfg.xml數(shù)據(jù)源則默認(rèn)是不是自動(dòng)提交的。解決的辦法如下:可以在hibernate.cfg.xml中填寫(xiě):

<property name="hibernate.connection.autocommit">true</property>

以下Spring使用hibernate.cfg.xml數(shù)據(jù)源

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">       <property name="configLocation">              <value>classpath:hibernate.cfg.xml</value>          </property>      <property name="mappingLocations">              <list>                  <value>classpath:User.hbm.xml</value>              </list>      </property>      </bean>

以上,介紹了Spring來(lái)管理Hibernate的好處在于,不用手動(dòng)創(chuàng)建SessionFactory,Session,不用手動(dòng)開(kāi)啟提交關(guān)閉事務(wù),這一切完全都是由Spring來(lái)管理。并且Spring還提供了HibernateTemple的工具,使一切操作簡(jiǎn)單方便。

dao層在Spring配置文件中配置如下:

<<span style="font-size:12px;">bean id="userDao" class="com.UserDao.UserDaoImpl">      <property name="sessionFactory" ref="sessionFactory"></property>  </bean></span>

則在dao層的代碼如下:

package com.UserDao;  import org.springframework.orm.hibernate3.HibernateTemplate;  import com.user.User;   public class UserDaoImpl extends HibernateTemplate implements UserDao {  @Override     public void insert(User user) {          this.save(user);          }  }

這只是其中的關(guān)鍵的代碼。

關(guān)于為什么用Spring來(lái)管理Hibernate就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI