為什麼要用Hibernate框架?這個在《Hibernate介紹》博客中已經提到了
既然用Hibernate框架訪問管理持久層
那為何又提到用Spring來管理以及整合Hibernate呢?
首先我們來看一下Hibernate進行操作的步驟
比如添加用戶的一個步驟
在此為了解釋提出的問題
只做一個截圖
若想看完整代碼示例
可以參考《八步詳解Hibernate的搭建及使用》
看截圖
可以看出
Hibernate操作的步驟如下
獲得Configuration對象
創建SessionFactory
創建Session
打開事務
進行持久化操作
比如上面的添加用戶操作
提交事務
發生異常
回滾事務
關閉事務
使用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
sqljdbc
jar;
<bean id=
dataSource
class=
mons
dbcp
BasicDataSource
>
<property name=
driverClassName
value=
com
microsoft
jdbc
sqlserver
SQLServerDriver
>
</property>
<property name=
url
value=
jdbc:sqlserver://
:
;database=test
></property>
<property name=
username
value=
sa
></property> <property name=
password
value=
></property>
</bean>
<bean id=
sessionFactory
class=
org
springframework
orm
hibernate
LocalSessionFactoryBean
>
<property name=
dataSource
ref=
dataSource
></property>
<!
hibernate屬性配置
>
<property name=
hibernateProperties
>
<props>
<prop key=
hibernate
dialect
>org
hibernate
dialect
SQLServerDialect</prop>
<prop key=
hibernate
hbm
ddl
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=
nnection
autocommit
>true</property>
以下Spring使用hibernate
cfg
xml數據源
<bean id=
sessionFactory
class=
org
springframework
orm
hibernate
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 >bean id=
userDao
class=
com
UserDao
UserDaoImpl
>
<property name=
sessionFactory
ref=
sessionFactory
></property>
</bean></span>
則在dao層的代碼如下
package com
UserDao;
import org
springframework
orm
hibernate
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中的事務管理
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28636.html