1.管理SessionFactorymysql
使用Spring整合Hibernate時咱們不須要hibernate.cfg.xml文件。首先,在applicationContext.xml中 配置數據源(dataSource)bean和session工廠(sessionFactory)bean。其中,在配置session工廠bean 時,應該注入三個方面的信息:spring
●數據源beansql
●全部持久化類的配置文件數據庫
●Hibernate的SessionFactory的屬性apache
Hibernate的SessionFactory的屬性信息又包括兩個內容,一,Hibernate的鏈接方法;二,不一樣數據庫鏈接,啓動時的選擇。編程
2.爲HibernateTemplate注入SessionFactory對象,經過HibernateTemplate來持久化對象session
Spring提供了HibernateTemplate,用於持久層訪問,該模板無需打開Session及關閉Session。它只要得到 SessionFactory的引用,將能夠只能地打開Session,並在持久化訪問結束後關閉Session,程序開發只需完成持久層邏輯,通用的操 做(如對數據庫中數據的增,刪,改,查)則有HibernateTemplate完成。app
HibernateTemplate有三個構造函數,不管是用哪種構造,要使HibernateTemplate能完成持久化操做,都必須向其傳入一個SessionFactory的引用。框架
HibernateTemplate的用法有兩種,一種是常規的用法,另外一種是複雜的用。ide
一,常規的用法
HibernateTemplate經過它本身的delete(Object entity) ,find(String queryString),save(Object entity)等等經常使用的方法便可完成大多數DAO對象的增,刪,改,查等操做。
二,複雜的用法
HibernateTemplate的複雜的用法是經過以下的兩個方法來完成的:
●Object execute(HibernateCallback action)
●List execute(HibernateCallback action)
這兩個方法都須要一個HibernateCallback實例,程序開發者經過HibernateCallback,能夠徹底使用Hibernate靈活 的方式來訪問數據庫,解決了Spring封裝Hibernate後靈活不足的缺陷。HibernateCallback是一個接口,該接口只有一個方法 doInHibernate(org.hibernate.Session session),該方法只有一個參數Session。
一般,程序中採用實現HibernateCallback的匿名內部類來獲取HibernateCallback的實例,方法doInHibernate就是Spring執行的持久化操做。具體的代碼實例以下:
public class PersonDaoImpl {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public List findPersonByName(final String name) {
HibernateTemplate hibernateTemplate =
new HibernateTemplate(this.sessionFactory);
return (List)hibernateTemplate.execute(
public Object doInHibernate(Session session) throws Hibernate Exception {
List result =session.createCriteria(Person.clsss)
.add(Restrictions.like("name",name+"%")).list();
return result;
}
);
}
}
注:在方法doInHibernate內能夠訪問Session,該Session對象是綁定到該線程的Session實例,該方法內的持久層操做與不使用Spring時的持久層操做徹底相同,這保證了對於複雜的持久層訪問時,依然可使用Hibernate的訪問方式。
3.DAO的實現
DAO的實現有兩種方式:一,繼承HibernateDaoSupport實現DAO;二,基於Hibernate3.0實現DAO。
一,繼承HibernateDaoSupport實現DAO
Spring爲Hibernate的DAO提供了工具類HibernateDaoSupport。該類主要提供了以下兩個方法來方便DAO的實現:
●public final HibernateTemplate getHibernateTemplate()
●public final void setSessionFactory(SessionFactory sessionFactory)
其中,setSessionFactory方法用來接收Spring的ApplicationContext依賴注入的SessionFactory實 例;getHibernateTemplate方法則用來根據剛纔的SessionFactory產生Session,最後由 HibernateTemplate來完成數據庫訪問。
二,基於Hibernate3.0實現DAO
在Hibernate處於事務的管理下時(一般Spring爲Hibernate提供事務管理),經過SessionFactory的 getCurrentSession()方法能夠返回當前的Session,若是當前的JTA事務關聯的Session不存在,則系統打開一次新的 Session,並關聯到當前的JTA事務;若是當前JTA事務關聯的Session已經存在,則直接返回該Session。得到了當前的Session 後就能夠進行持久化操做了。
可見,不論使用上面的哪種方式實現DAO都須要用Spring來注入SessionFactory實例。
4.事務的管理
Hibernate建議全部的對數據庫的訪問都應放在事務內進行,即便進行的只是讀操做。Spring同時支持編程式事務和聲明式事務。一般推薦使用聲明式事務。
編程式事務管理:
編程式事務提供了TransactionTemplate模板類,用的時候必須向其體提供一個PlatformTransactionManager實例。只要TransactionTemplate獲取了PlatformTransactionManager的引用,TransactionTemplate就能夠完成事務操做了。TransactionTemplate提供了一個execute方法,它接收一個TransactionCallback實例。TransactionCallback包含以下方法:
●Object doInTransaction(TransactionStatus status)
這是須要有返回值的狀況。若是不須要有返回值的話,咱們能夠用TransactionCallbackWithOutResult類來代替TransactionCallback類,它也有一個方法:
●void doInTransaction(TransactionStatus status)
在這個兩個方法中,在出現異常時,TransactionStatus的實例status能夠調用setRollbackOnly()方法進行回滾。
通常狀況下,向execute方法傳入TransactionCallback或TransactionCallbackWithOutResult實例時,採用的是匿名內部類的形式。
聲明式事務管理:
聲明式事務管理的配置方式一般有三種:
●使用TransactionProxyFactoryBean爲目標bean生成事務代理的配置。
●使用BeanNameAutoProxyCreator,根據bean name自動生成事務代理的方式,這是直接利用Spring的AOP框架配置事務代理的方式,須要對Spring的AOP框架有所瞭解。
●使用DefaultAdvisorAutoProxyCreator,這也是直接利用Spring的AOP框架配置事務代理的方式,只是這種配置方式的可讀性不如使用BeanNameAutoProxyCreator的配置方式。
------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost/test</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>8093</value>
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource"/>
</property>
<property name="mappingResources">
<list>
<value>user.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="userDAO" class="com.dang.action.UserDAOImpl">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<bean name="/regedit" class="com.dang.action.RegeditAction">
<property name="userDAO">
<ref bean="userDAO"/>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> <property name="target"> <ref local="userDAO" /> </property> <property name="transactionAttributes"> <props> <prop key="create*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> </beans>