Spring学习笔记六:Spring整合Hibernate

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6785323.html 

前言:整合概述

    Spring整合Hibernate主要是把Hibernate中常用的SessionFactory、session对象等的创建托管给Spring容器,并且利用SpringAOP进行事务管理。

    由“常用对象托管、事务管理”的需求,我们就不难得到整合时需要做的工作了:

    1:托管Hibernate常用的对象如:SessionFactory

    2:托管数据源

    3:事务管理配置

    4:托管持久层对象,并注入sessionFactory

    5:持久层对象使用sessionFactory进行持久化操作,也可以使用Spring提供的持久层操作模版进行持久化操作

    下面,是具体整合开发的步骤。

一:定义实体类Bean,并得到每个实体类的映射文件。

    可以由反向工程,由数据库表快速得到实体bean以及映射文件。

二:定义持久层DAO Bean

    继承HibernateDaoSupport 定义DAO bean,bean中定义一个私有成员 SessionFactory,然后定义一系列持久化方法。

    整合后持久化方法有两种写法:

    1:按照传统的Hibernate框架的使用方法,通过sessionFactory.openSession等方法获取session,然后用session进行HQL/QBC查询。

    2:使用Spring对Hibernate框架的进一步封装得到的方法,建议使用第一种:模版法

    getHibernateTemplate():返回一个Hibernate操作模版类,提供一系列简单的save/find/update等方法,并且自动管理事务与session生命周期。

   不配置事务时:每次操作对应一个新的session自动提交,自动关闭

   配置事务时:统一一个事务绑定一个session事务由spring管理,自动关闭

getHibernateTemplate().save(member);
getHibernateTemplate().update(member);
getHibernateTemplate().delete(getHibernateTemplate().get("com.leec.demo.db.DTO.MemberDTO", _id));

String queryString = "from MemberDTO where name = ?";
List<MemberDTO> ls = getHibernateTemplate().find(queryString, _name);

   getSession()

  不配置事务时:每次操作对应一个新的session,手动提交,手动关闭;

  配置事务时:统一一个事务绑定一个session,事务由spring管理,自动关闭;

   getHibernateTemplate().getSessionFactory().getCurrentSession()——

   这是hibernate的官方方法,获取当前线程绑定的session

   不配置事务时:不能使用;

   配置事务时:统一一个事务绑定一个session,事务由spring管理,自动关闭;

   getHibernateTemplate().getSessionFactory().openSession()(不推荐使用)

   这是hibernate的官方方法,创建一个新的session

   事务自己管理,不受spring控制,同hibernate原来的做法,手动提交,手动关闭;

三:配置applicationContext.xml

    1:配置数据源:指明数据源种类、驱动、数据库url、用户名、密码等

    <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource">//主要有两种:传统的BasicDataSourse和C3P0的CombolpooledDataSourse
    <!--配置数据库连接信息-->    
    <property name="driverClassName">
       <value>com.mysql.jdbc.Driver</value>
    </property>
    <property name="url" value="jdbc:mysql://localhost:3306/数据库名" />
    <property name="username">
       <value>账户</value>
    </property>
    <property name="password">
       <value>密码</value>
    </property>
    </bean>
 <bean id="dataSource"    
        class="com.mchange.v2.c3p0.ComboPooledDataSource"    
        destroy-method="close">    
        <property name="driverClass">    
            <value>com.mysql.jdbc.Driver</value>    
        </property>    
        <property name="jdbcUrl">    
            <value>jdbc:mysql://localhost:3306/数据库名</value>    
        </property>    
        <property name="user">    
            <value>root</value>    
        </property>    
        <property name="password">    
            <value>root</value>    
        </property>
     </bean>

    2:整合Hibernate:配置SessionFactory标签,在子标签中  注入数据源、指明hibernate的相关配置信息、配置映射文件路径

<bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <!--注入数据源-->
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
        <!--配置hibernate配置,主要是之前hibernate.cfg.xml中的信息-->
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">//方言
                    org.hibernate.dialect.MySQLDialect
                </prop>
                <prop key="hibernate.show_sql">//打印语句
                    true
                </prop>
            </props>
        </property>
         <!--配置实体类的映射文件-->
        <property name="mappingResources">
            <list>//多个映射文件,用list来罗列
                <value>XX/XXX/XX.hbm.xml</value>    
                <value>XX/XX/XXX.hbm.xml</value>
                                ......            
            </list>
        </property>
    </bean>

    3:注册各种要托管的Bean,进行各种设置如:注入(DAO bean尤其要记得注入sessionFactory

<bean id="Service"
        class="...Service">
        <property name="XXDAO Bean成员" ref="XXDAO" />//注入DAO对象,在service层调用持久化方法
</bean>

<bean id=XXDAO"
        class="...xxDAO">
        <property name="sessionFactory">//往DAObean注入sessionFactory,以供进行hibernate持久化操作
            <ref bean="sessionFactory" />
        </property>
</bean>

    4:配置事务管理器

<bean id="txManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">//使用Hibernate事务管理器
        <property name="sessionFactory">//注入sessionFactory
            <ref bean="sessionFactory" />
        </property>
    </bean>

    5:配置事务管理通知tx:advice

  <!-- 事务通知 -->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <!-- 为哪些方法进行事务管理、怎么管理-->
        <tx:attributes>
            <!-- 所有get开头的方法的事务定义 -->
            <tx:method name="get*" propagation="REQUIRED"/>//以正则表达式的形式匹配需要进行事务管理的方法,并指明如何管理事务
            <!-- 其他的方法的事务定义-->
            <tx:method name="*" .../>
        </tx:attributes>
    </tx:advice>

    6:配置切面,把事务通知切入Service层的方法

    <aop:config>
      <aop:pointcut id="pointcut1" expression="execution(返回值 路径.方法名.(参数列表))"/>//切入点筛选出需要进行事务管理的方法,至于如何管理,则在tx:advice中再匹配
      <aop:advisor advice-ref="txAdvice1" pointcut-ref="pointcut1"/>
    </aop:config>

 <bean id="dataSource"            class="com.mchange.v2.c3p0.ComboPooledDataSource"            destroy-method="close">            <property name="driverClass">                <value>com.mysql.jdbc.Driver</value>            </property>            <property name="jdbcUrl">                <value>jdbc:mysql://localhost:3306/couplespace</value>            </property>            <property name="user">                <value>root</value>            </property>            <property name="password">                <value>root</value>            </property>     </bean>

原文地址:https://www.cnblogs.com/ygj0930/p/6785323.html