• 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>

  • 相关阅读:
    IOS开发调用系统相机和打开闪光灯
    iOS 判断输入字符串长度函数
    Mac下Cocos2d和Cocos2dx安装
    同样的一辈子,不同的结果!
    Mac OS 和 iOS 操作系统架构
    摄影师张梦格App项目总结
    Mac下WorkPress平台的安装与搭建
    dagger与spring注解对比
    git rebase 命令参数
    初识Devexpress ChartControl 之 动态添加stepline及TextAnnotation
  • 原文地址:https://www.cnblogs.com/ygj0930/p/6785323.html
Copyright © 2020-2023  润新知