转载请注明原文地址: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. linux系统部署Java程序获取ip时报Caused by: java.net.UnknownHostException: XXXXXXXXXX: XXXXXXXXXX: Name or service not known

    问题一: Caused by: java.net.UnknownHostException: XXXXXXXXXX: XXXXXXXXXX: Name or service not known vi ...

  2. mongodb常用查询

    mongo sql 说明 db.users.find() select * from users 从user表中查询所有数据 db.users.find({“username” : “joe”, “a ...

  3. SQLite中的增删改查

    虽然android提供了sql查询的封装方法,但是理解起来还是麻烦,所以我这里用sql语句来完成工作. 首先是建立一个类,继承SQLiteOpenHelper 这里面会建立一个数据库,并且初始化一个表 ...

  4. 【BZOJ】【3211】花神游历各国

    线段树/暴力 线段树区间开方 唉,我傻逼了一下,TLE了一发,因为没考虑到0的情况…… 好吧简单来说一下,线段树动态查询区间和大家都会做……比较麻烦的是这次的修改变成开方了,然而这并没有什么好虚的,注 ...

  5. maven打包加时间戳

    基于Maven的项目,发布时需要打包,如tar.gz.web项目打成war格式包.每次打包时希望自己加上时间戳,假如我的项目名是myproject,默认打包后名为myproject.war.而我希望的 ...

  6. HTTP协议学习【转】

    面试过程中又一个常见的问题,http协议,因为做服务器开发如果用http协议的话,现在各种开源软件都封装好了,python中只需要简单的继承定义好的类,重写get或者post等方法,几行代码就可以搭建 ...

  7. iOS: 获取UITableViewCell上添加的子控件对应的cell

    一.简单介绍 UITableViewCell是UITableView的核心部分,我们在开发中因为功能的扩展经常需要自定义,以便在其上面添加子控件,例如button.label等.添加后获取这些子控件的 ...

  8. Pytorch 0.3加载0.4模型及其之间版本的变化

    1. 0.4中使用设备:.to(device) 2. 0.4中删除了Variable,直接tensor就可以 3. with torch.no_grad():的使用代替volatile:弃用volat ...

  9. JavaScript-手机中访问页面判断

    最近在做微信服务号开发,其中遇到一个问题是微信服务号查看的个人的消息,如果点击在浏览器中查看(iOS中是在Safari中打开)应该是跳转到登录页面,因为页面需要从后台获取,因为需要服务端判断,如果是存 ...

  10. {{jQuery源码分析}}jQuery对象初始化的多种传参数形式

    jQuery对象初始化的传参方式包括:1.$(DOMElement)2.$('<h1>...</h1>'), $('#id'), $('.class') 传入字符串, 这是最常 ...