转载请注明原文地址: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>

Spring学习笔记六:Spring整合Hibernate的更多相关文章

  1. Java架构师之路 Spring学习笔记(一) Spring介绍

    前言 这是一篇原创的Spring学习笔记.主要记录我学习Spring4.0的过程.本人有四年的Java Web开发经验,最近在面试中遇到面试官总会问一些简单但我不会的Java问题,让我觉得有必要重新审 ...

  2. spring学习笔记(一) Spring概述

    博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书.  强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...

  3. Spring 学习笔记(2) Spring Bean

    一.IoC 容器 IoC 容器是 Spring 的核心,Spring 通过 IoC 容器来管理对象的实例化和初始化(这些对象就是 Spring Bean),以及对象从创建到销毁的整个生命周期.也就是管 ...

  4. Spring学习笔记:spring整合web之spring-web架包的引用(WebApplicationContextUtils注入容器)

    WebApplicationContextUtils 一.Spring整合web之前 案例:给部门列表添加新部门 import org.apache.log4j.Logger; import org. ...

  5. Spring学习笔记:Spring整合Mybatis(mybatis-spring.jar)(二:mybatis整合spring)

    http://blog.csdn.net/qq598535550/article/details/51703190 二.Spring整合mybatis其实是在mybatis的基础上实现Spring框架 ...

  6. Spring学习(六)整合web开发

    https://www.cnblogs.com/Leo_wl/p/4459274.html 1.加载Spring核心配置文件 //1.加载Spring配置文件,根据创建对对象 ApplicationC ...

  7. Spring学习笔记:spring与mybatis四种整合方法

    1.采用数据映射器(MapperFactoryBean)的方式,不用写mybatis映射文件,采用注解方式提供相应的sql语句和输入参数.  (1)Spring配置文件: <!-- 引入jdbc ...

  8. Spring学习笔记:Spring整合Mybatis(mybatis-spring.jar)(一:知识点回顾)

    一.知识点回顾 1.Mybatis环境搭建(DAO层的实现)(使用maven项目管理工具) 需要引入的依赖包: <!-- 单元测试junit --> <dependency> ...

  9. Spring学习笔记:Spring整合Mybatis学习PPT(三:整合思路)

    三.Spring-Mybatis的整合思路

随机推荐

  1. DES、MD5、RSA加密算法

    本篇主要是实现标题中的三个加密算法,至于机制大家自行百度吧. 一.DES 实现类:DES.java package com.kale.des; import java.security.SecureR ...

  2. 《软件定义网络:SDN与OpenFlow解析》

    <软件定义网络:SDN与OpenFlow解析> 基本信息 原书名:SDN: Software Defined Networks 原出版社: O'Reilly Media 作者: (美)Th ...

  3. C#和java之间的一些差异与共性

    C#与java之间的一些共性和差异整理 隐藏:与java中的重写几乎一致,但是需要添加new关键字让编译器知道,否则会有警告 虚方法:1.声明为virtual的方法就是虚方法,在子类中使用overri ...

  4. SIFT(Scale-invariant feature transform) & HOG(histogram of oriented gradients)

    SIFT :scale invariant feature transform HOG:histogram of oriented gradients 这两种方法都是基于图像中梯度的方向直方图的特征提 ...

  5. [转]Linux常用命令大全

    From : http://www.php100.com/html/webkaifa/Linux/2009/1106/3485.html 系统信息 arch 显示机器的处理器架构(1) uname - ...

  6. django数据模型中 null=True 和 blank=True 有什么区别?

    null 如果为 True , Django 在数据库中会将空值(empty)存储为 NULL .默认为 False . blank 设置字段是否可以为空,默认为False(不允许为空) 和null的 ...

  7. swift3.0:CoreData的使用

    一.介绍 CoreData不像slqite3那样编写代码繁琐,同时避免了使用了SQL语句的麻烦,也可以回避使用C语言的语法,降低了iOS开发的技术门槛. CoreData可降低开发成本,提高代码质量. ...

  8. go语言之进阶篇json解析到结构体

    1.json解析到结构体 示例: package main import ( "encoding/json" "fmt" ) type IT struct { ...

  9. [ Laravel 5.5 文档 ] 官方扩展包 —— 全文搜索解决方案:Laravel Scout

    简介 Laravel Scout 为 Eloquent 模型全文搜索实现提供了简单的.基于驱动的解决方案.通过使用模型观察者,Scout 会自动同步更新模型记录的索引. 目前,Scout 通过 Alg ...

  10. 简单实现http proxy server怎么实现?

    原文:https://blog.csdn.net/dolphin98629/article/details/54599850 简单实现http proxy server怎么实现?