1.管理SessionFactory
使用Spring整合Hibernate時我們不需要hibernate.cfg.xml文件。首先,在applicationContext.xml中配置數據源(dataSource)bean和session工廠(sessionFactory)bean。其中,在配置session工廠bean時,應該注入三個方面的信息:
●數據源bean
●所有持久化類的配置文件
●Hibernate的SessionFactory的屬性
Hibernate的SessionFactory的屬性信息又包括兩個內容,一,Hibernate的連接方法;二,不同數據庫連接,啓動時的選擇。
2.爲HibernateTemplate注入SessionFactory對象,通過HibernateTemplate來持久化對象
Spring提供了HibernateTemplate,用於持久層訪問,該模板無需打開Session及關閉Session。它只要獲得SessionFactory的引用,將可以只能地打開Session,並在持久化訪問結束後關閉Session,程序開發只需完成持久層邏輯,通用的操作(如對數據庫中數據的增,刪,改,查)則有HibernateTemplate完成。
HibernateTemplate有三個構造函數,不論是用哪一種構造,要使HibernateTemplate能完成持久化操作,都必須向其傳入一個SessionFactory的引用。
HibernateTemplate的用法有兩種,一種是常規的用法,另一種是複雜的用。
一,常規的用法
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>
使用spring的hibernateTemplate的方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.