spring對hibernate的支持詳解

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>

相關文章
相關標籤/搜索