javascript
为什么用Spring来管理Hibernate?
為什么用Spring來管理Hibernate?
為什么要用Hibernate框架?這個(gè)在《Hibernate介紹》博客中已經(jīng)提到了。
既然用Hibernate框架訪問管理持久層,那為何又提到用Spring來管理以及整合Hibernate呢?
首先我們來看一下Hibernate進(jìn)行操作的步驟。比如添加用戶的一個(gè)步驟。在上一篇博客中《八步詳解Hibernate的搭建及使用》詳細(xì)介紹到了Hibernate使用的步驟。以下的代碼來自上篇博客,在此為了解釋提出的問題,只做一個(gè)截圖,若想看完整代碼示例,可以參考《八步詳解Hibernate的搭建及使用》
看截圖,可以看出,Hibernate操作的步驟如下:
1.獲得Configuration對象
2.創(chuàng)建SessionFactory
3.創(chuàng)建Session
4.打開事務(wù)
5.進(jìn)行持久化操作。比如上面的添加用戶操作
6.提交事務(wù)
7.發(fā)生異常,回滾事務(wù)
8.關(guān)閉事務(wù)
使用Hibernate進(jìn)行訪問持久層,每次都要進(jìn)行這八個(gè)步驟。但是若使用Spring對Hibernate進(jìn)行管理,又是怎么樣的呢?
首先,Spring對Hibernate提供了HibernateTemple類。這個(gè)模版類對session進(jìn)行封裝。并且Spring會(huì)默認(rèn)為自動(dòng)提交事務(wù)。所在在dao層直接寫入this.save(Object)即可。
在實(shí)踐中,遇到了一個(gè)問題,無法插入數(shù)據(jù)庫,經(jīng)過一番折騰,多次實(shí)驗(yàn),驗(yàn)證,總結(jié)一下原因,結(jié)果如下:
注意:所有的操作都必須在事務(wù)中進(jìn)行。若單純的使用Hibernate,則事務(wù)需要手動(dòng)開啟提交關(guān)閉操作。當(dāng)然也可以在Hibernate配置文件中,自動(dòng)提交。
若使用Spring管理Hibernate,則默認(rèn)的是自動(dòng)提交事務(wù)。但是在此,需要注意的是:若使用Spring在配置文件中配置數(shù)據(jù)源而不使用hibernate.cfg.xml,則可以成功插入數(shù)據(jù)庫,因?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;
[html]view plaincopyprint?<beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource">
<propertyname="driverClassName"value="com.microsoft.jdbc.sqlserver.SQLServerDriver"></property>
<propertyname="url"value="jdbc:sqlserver://192.168.24.176:1433;database=test"></property>
<propertyname="username"value="sa"></property>
<propertyname="password"value="123"></property>
</bean>
<beanid="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<propertyname="dataSource"ref="dataSource"></property>
<!-- hibernate屬性配置 -->
<propertyname="hibernateProperties">
<props>
<propkey="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
<propkey="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
lt;!-- ? ? ?如果采用傳統(tǒng)的hbm.xml的方式,可以采用如下方式來簡化注冊hbm.xml的步驟,并且class為LocalSessionFactoryBean -->
<propertyname="mappingLocations">
<list>
<value>classpath:User.hbm.xml</value>
</list>
</property>
</bean>
若Spring中不是直接配置數(shù)據(jù)源,而是使用hibernate.cfg.xml,則是無法若直接this.save(Object),則無法插入數(shù)據(jù)庫中,但是可以保存中緩存中。因?yàn)樗械牟僮鞫际窃谑聞?wù)中執(zhí)行的,而hibernate.cfg.xml數(shù)據(jù)源則默認(rèn)是不是自動(dòng)提交的。解決的辦法如下:可以在hibernate.cfg.xml中填寫:
<property name="hibernate.connection.autocommit">true</property>
以下Spring使用hibernate.cfg.xml數(shù)據(jù)源
[html]view plaincopyprint?<beanid="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<propertyname="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<propertyname="mappingLocations">
<list>
<value>classpath:User.hbm.xml</value>
</list>
</property>
</bean>
以上,介紹了Spring來管理Hibernate的好處在于,不用手動(dòng)創(chuàng)建SessionFactory,Session,不用手動(dòng)開啟提交關(guān)閉事務(wù),這一切完全都是由Spring來管理。并且Spring還提供了HibernateTemple的工具,使一切操作簡單方便。
dao層在Spring配置文件中配置如下:
[html]view plaincopyprint?<<SPANstyle="FONT-SIZE: 12px">bean id="userDao"class="com.UserDao.UserDaoImpl">
<propertyname="sessionFactory"ref="sessionFactory"></property>
</bean></SPAN>
則在dao層的代碼如下:
[html]view plaincopyprint?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)鍵的代碼,至于完整的小demo,已經(jīng)上傳。
正如上述所說,一切操作盡在事務(wù)中,事務(wù)這個(gè)概念想必大家不陌生吧,一般情況,事務(wù)應(yīng)該在業(yè)務(wù)邏輯層,而不是在dao層應(yīng)用。并且Spring對事務(wù)有很好的封裝,自己有一套事務(wù)管理的封裝,使業(yè)務(wù)邏輯與事務(wù)管理分離,進(jìn)一步達(dá)到解耦作用。下一篇博客,我們繼續(xù)會(huì)講解Spring管理Hibernate中的事務(wù)管理。
轉(zhuǎn)載于:https://blog.51cto.com/longx/1350846
總結(jié)
以上是生活随笔為你收集整理的为什么用Spring来管理Hibernate?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 自动化测试——Monke
- 下一篇: 手机客户端和服务器端通信