歡迎您光臨本站 註冊首頁

為什麼用Spring來管理Hibernate?

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0
為什麼要用Hibernate框架?這個在《Hibernate介紹》博客中已經提到了.

既然用Hibernate框架訪問管理持久層,那為何又提到用Spring來管理以及整合Hibernate呢?

首先我們來看一下Hibernate進行操作的步驟.比如添加用戶的一個步驟.在此為了解釋提出的問題,只做一個截圖,若想看完整代碼示例,可以參考《八步詳解Hibernate的搭建及使用》

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

1.獲得Configuration對象

2.創建SessionFactory

3.創建Session

4.打開事務

5.進行持久化操作.比如上面的添加用戶操作

6.提交事務

7.發生異常,回滾事務

8.關閉事務

使用Hibernate進行訪問持久層,每次都要進行這八個步驟.但是若使用Spring對Hibernate進行管理,又是怎麼樣的呢?

首先,Spring對Hibernate提供了HibernateTemple類.這個模版類對session進行封裝.並且Spring會默認為自動提交事務.所在在dao層直接寫入this.save(Object)即可.

在實踐中,遇到了一個問題,無法插入資料庫,經過一番折騰,多次實驗,驗證,總結一下原因,結果如下:

注意:所有的操作都必須在事務中進行.若單純的使用Hibernate,則事務需要手動開啟提交關閉操作.當然也可以在Hibernate配置文件中,自動提交.

若使用Spring管理Hibernate,則默認的是自動提交事務.但是在此,需要注意的是:若使用Spring在配置文件中配置數據源而不使用hibernate.cfg.xml,則可以成功插入資料庫,HibernateTemple默認提供自動提交事務.在Spring的配置文件配置數據源如下:使用此數據源需要的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>

!-- 如果採用傳統的hbm.xml的方式,可以採用如下方式來簡化註冊hbm.xml的步驟,並且class為LocalSessionFactoryBean -->

<property name="mappingLocations">

<list>

<value>classpath:User.hbm.xml</value>

</list>

</property>

</bean>

若Spring中不是直接配置數據源,而是使用hibernate.cfg.xml,則是無法若直接this.save(Object),則無法插入資料庫中,但是可以保存中緩存中.所有的操作都是在事務中執行的,而hibernate.cfg.xml數據源則默認是不是自動提交的.解決的辦法如下:可以在hibernate.cfg.xml中填寫:

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

以下Spring使用hibernate.cfg.xml數據源

<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來管理Hibernate的好處在於,不用手動創建SessionFactory,Session,不用手動開啟提交關閉事務,這一切完全都是由Spring來管理.並且Spring還提供了HibernateTemple的工具,使一切操作簡單方便.

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);

}

}

這只是其中的關鍵的代碼,至於完整的小demo,已經上傳.

正如上述所說,一切操作盡在事務中,事務這個概念想必大家不陌生吧,一般情況,事務應該在業務邏輯層,而不是在dao層應用.並且Spring對事務有很好的封裝,自己有一套事務管理的封裝,使業務邏輯與事務管理分離,進一步達到解耦作用.下一篇博客,我們繼續會講解Spring管理Hibernate中的事務管理.


[火星人 ] 為什麼用Spring來管理Hibernate?已經有1576次圍觀

http://coctec.com/docs/java/show-post-59899.html