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>
Spring学习笔记六:Spring整合Hibernate的更多相关文章
- Java架构师之路 Spring学习笔记(一) Spring介绍
前言 这是一篇原创的Spring学习笔记.主要记录我学习Spring4.0的过程.本人有四年的Java Web开发经验,最近在面试中遇到面试官总会问一些简单但我不会的Java问题,让我觉得有必要重新审 ...
- spring学习笔记(一) Spring概述
博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书. 强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...
- Spring 学习笔记(2) Spring Bean
一.IoC 容器 IoC 容器是 Spring 的核心,Spring 通过 IoC 容器来管理对象的实例化和初始化(这些对象就是 Spring Bean),以及对象从创建到销毁的整个生命周期.也就是管 ...
- Spring学习笔记:spring整合web之spring-web架包的引用(WebApplicationContextUtils注入容器)
WebApplicationContextUtils 一.Spring整合web之前 案例:给部门列表添加新部门 import org.apache.log4j.Logger; import org. ...
- Spring学习笔记:Spring整合Mybatis(mybatis-spring.jar)(二:mybatis整合spring)
http://blog.csdn.net/qq598535550/article/details/51703190 二.Spring整合mybatis其实是在mybatis的基础上实现Spring框架 ...
- Spring学习(六)整合web开发
https://www.cnblogs.com/Leo_wl/p/4459274.html 1.加载Spring核心配置文件 //1.加载Spring配置文件,根据创建对对象 ApplicationC ...
- Spring学习笔记:spring与mybatis四种整合方法
1.采用数据映射器(MapperFactoryBean)的方式,不用写mybatis映射文件,采用注解方式提供相应的sql语句和输入参数. (1)Spring配置文件: <!-- 引入jdbc ...
- Spring学习笔记:Spring整合Mybatis(mybatis-spring.jar)(一:知识点回顾)
一.知识点回顾 1.Mybatis环境搭建(DAO层的实现)(使用maven项目管理工具) 需要引入的依赖包: <!-- 单元测试junit --> <dependency> ...
- Spring学习笔记:Spring整合Mybatis学习PPT(三:整合思路)
三.Spring-Mybatis的整合思路
随机推荐
- 在linux下创建自定义service服务
三个部分 这个脚本分为3个部分:[Unit] [Service] [Install]. Unit Unit表明该服务的描述,类型描述.我们称之为一个单元.比较典型的情况是单元A要求在单元B启动之后再启 ...
- 《数据挖掘:R语言实战》
<数据挖掘:R语言实战> 基本信息 作者: 黄文 王正林 丛书名: 大数据时代的R语言 出版社:电子工业出版社 ISBN:9787121231223 上架时间:2014-6-6 出版 ...
- 为何要对URL进行编码
为何要对URL进行编码 我们都知道Http协议中参数的传输是"key=value"这种简直对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割.如"?na ...
- APPLE框架之高效便捷的Repository解决方案
原文地址:http://perfy315.iteye.com/blog/1460226 Spring Data JPA 转至:http://note.sdo.com/u/855924134/n/P15 ...
- Guava中针对集合的 filter和过滤功能
在guava库中,自带了过滤器(filter)的功能,可以用来对collection 进行过滤,先看例子: import com.google.common.base.Predicates; impo ...
- 我对android 软件栈了解
android 软件栈如图所示: Android平台的核心是Linux内核,它负责设备驱动程序.资源访问.电源管理和完成其他操作系统的职责.提供的设备驱动程序包括显示器.照相机,键盘.WiFi.闪存. ...
- MySql查询时间段的方法(转)
http://www.jb51.net/article/58668.htm 本文实例讲述了MySql查询时间段的方法.分享给大家供大家参考.具体方法如下: MySql查询时间段的方法未必人人都会,下面 ...
- MongoDB的Invalid credentials for database
前面都好好的,结果服务器数据库加了一个验证,查了一下,也不算复杂,只要把连接串一改就行了. 结果,不断报错——Invalid credentials for database 找了半天原因,原来是我用 ...
- Windows xcopy
1.考虑下面的需求,把aaa目录下面的111.txt 拷贝到 bbb,如下:echo onxcopy .\aaa\111.txt .\bbb\ /ypause2.注意这里表示路径要用右斜杠,因为左斜杠 ...
- 保存登录plsql developer 的用户名和密码
1 保存用户名 tools -> Preferences -> User Interface - Options 勾选 Autosave username . 保存 2 保存密码 tool ...