Spring对Hibernate的事务支持
2012-07-08 20:59
363 查看
spring提供了对hibernate等pojo对象的事务管理的支持。这是一个spring的一个意义重大的特性。
spring提供两种方式对hibernate提供事务管理方式,分别为编程式事务管理和声明式事务管理。
spring事务策略,也就是spring事务管理的实现方式.它有一个统一的抽象是由实现下面这个接口完成的.org.springframework.transaction.PlatformTransactionManager.像我们常见到的HibernateTransactionManager也是实现的这个接口。
不管是声明式的还是编程式的事务管理都需要此抽象来完成.
一、编程式事务
编程式事务常用getCurrentSession和openSession来完成。
代码片段
那么这两种方法openSession和getCurrentSession有什么区别呢?
(1)、openSession必须关闭,currentSession在事务结束后自动关闭
openSession没有和当前线程绑定,currentSession和当前线程绑定,即在一个线程中是同一个Session。而OpenSession每次用到的都不是同一个,所以用完后需要关闭。
(2)、如果使用currentSession需要在hibernate.cfg.xml文件中进行配置:
* 如果是本地事务(jdbc事务)
<propertyname="hibernate.current_session_context_class">thread</property>
* 如果是全局事务(jta事务)
<propertyname="hibernate.current_session_context_class">jta</property>
二、声明式事务管理。
来看spring对hibernate的声明式事务支持。。
Spring对声明式事务的支持其实就是spring的AOP框架的一个实现。AOP显然很适合来实现声明式事务管理,因为事务是系统级的服务,他跟主功能逻辑没有关系,应该是在应用程序主功能的上面一层。这样可以把spring的事务认作是包装了一个方法的切面。
声明式事务主要在配置文件中进行配置。
大多数Spring用户选择声明式事务管理,这是最少影响应用代码的选择,因而这是和非侵入性的轻量级容器的观念是一致的。
最后,总结一下Spring事务的优点:
为不同的事务API提供一致的编程模型,如JTA、JDBC、Hibernate、iBATIS数据库层JDO
提供比大多数事务API更简单的、易于使用的编程式事务管理API
整合Spring数据访问抽象
支持Spring声明式事务管理
spring提供两种方式对hibernate提供事务管理方式,分别为编程式事务管理和声明式事务管理。
spring事务策略,也就是spring事务管理的实现方式.它有一个统一的抽象是由实现下面这个接口完成的.org.springframework.transaction.PlatformTransactionManager.像我们常见到的HibernateTransactionManager也是实现的这个接口。
不管是声明式的还是编程式的事务管理都需要此抽象来完成.
一、编程式事务
编程式事务常用getCurrentSession和openSession来完成。
代码片段
public void addUser(User user) { Sessionsession=null; try{ session=HibernateUtils.getSessionFactory().getCurrentSession(); //或者session=HibernateUtils.getSessionFactory().openSession(); session.beginTransaction(); session.save(user); Log log=new Log(); log.setType("caozuorizhi"); log.setTime(new Date()); log.setDetail("RIZHI"); LogManager logManager=newLogMangerImpl(); logManager.addLog(log); session.getTransaction().commit(); }catch(Exception e){ e.printStackTrace(); session.getTransaction().rollback(); } }
那么这两种方法openSession和getCurrentSession有什么区别呢?
(1)、openSession必须关闭,currentSession在事务结束后自动关闭
openSession没有和当前线程绑定,currentSession和当前线程绑定,即在一个线程中是同一个Session。而OpenSession每次用到的都不是同一个,所以用完后需要关闭。
(2)、如果使用currentSession需要在hibernate.cfg.xml文件中进行配置:
* 如果是本地事务(jdbc事务)
<propertyname="hibernate.current_session_context_class">thread</property>
* 如果是全局事务(jta事务)
<propertyname="hibernate.current_session_context_class">jta</property>
二、声明式事务管理。
来看spring对hibernate的声明式事务支持。。
Spring对声明式事务的支持其实就是spring的AOP框架的一个实现。AOP显然很适合来实现声明式事务管理,因为事务是系统级的服务,他跟主功能逻辑没有关系,应该是在应用程序主功能的上面一层。这样可以把spring的事务认作是包装了一个方法的切面。
声明式事务主要在配置文件中进行配置。
<!-- 配置SessionFactory --> <bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation"> <value>classpath:hibernate.cfg.xml</value> </property> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> <!-- 说明哪些方法使用事务 --> <aop:config> <aop:pointcut id="allManagerMethod"expression="execution(* com.wh.usermgr.manager.*.*(..))"/> <aop:advisor pointcut-ref="allManagerMethod"advice-ref="txAdvice"/> </aop:config> <!--事务的传播特性配置 --> <tx:advice id="txAdvice"transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*"propagation="REQUIRED"/> <tx:method name="del*"propagation="REQUIRED"/> <tx:method name="modify*"propagation="REQUIRED"/> <tx:method name="*"propagation="REQUIRED" read-only="true"/> </tx:attributes> </tx:advice>
大多数Spring用户选择声明式事务管理,这是最少影响应用代码的选择,因而这是和非侵入性的轻量级容器的观念是一致的。
最后,总结一下Spring事务的优点:
为不同的事务API提供一致的编程模型,如JTA、JDBC、Hibernate、iBATIS数据库层JDO
提供比大多数事务API更简单的、易于使用的编程式事务管理API
整合Spring数据访问抽象
支持Spring声明式事务管理
相关文章推荐
- 不明觉厉的spring(4)---spring对持久层(jdbc,hibernate)以及事务的支持
- Atomikos+Spring+Hibernate支持多数据源+事务回滚
- Hibernate 事务处理和spring中配置事务
- Java事务处理全解析(八)——分布式事务入门例子(Spring+JTA+Atomikos+Hibernate+JMS)
- Spring对ORM的支持之集成Hibernate3
- hibernate+spring 注解 对事务的一些信息
- spring管理hibernate事务报异常--Transaction not successfully started解决方法
- Spring Hibernate事务配置总结
- spring和hibernate整合,事务管理
- Spring对Hibernate的支持
- 再谈spring的事务(集成hibernate)
- 深入理解Spring Redis的使用 (二)、RedisTemplate事务支持、序列化
- spring对hibernate提供的事务管理的一个实用的例子
- 【第八章】 对ORM的支持 之 8.2 集成Hibernate3 ——跟我学spring3
- Spring整合Hibernate,事务的几种传播特性,数据库事务隔离级别(脏读幻读不可重复读)
- Spring和Hibernate集成--声明式事务
- 8 -- 深入使用Spring -- 6...2 Spring支持的事务策略
- Spring+Hibernate多数据源事务
- Java事务处理全解析(八)——分布式事务入门例子(Spring+JTA+Atomikos+Hibernate+JMS)
- 在Spring中集成Hibernate事务(转自天极网)