public User saveAndFindAll(){
User user = new User();
user.setUserName("chenglong");
user.setNickName("huanhuan");
user.setLoginTimes(5);
user.setPhone("13261165539");
user.setRegTime(new Date());
userDao.save(user); //插入
return userDao.findAll(User.class);//查询
}
如果没有配置事务,日志是这样:(注意加粗处session的开关以及session.flush()的时机)
2010-11-11 14:29:59,855 DEBUG [org.springframework.orm.hibernate3.SessionFactoryUtils] -
Opening Hibernate Session
Hibernate: insert into User (userName, nickName, regTime, loginTimes, phone, lastLogin) values (?, ?, ?, ?, ?, ?)
2010-11-11 14:29:59,925 DEBUG [org.springframework.orm.hibernate3.HibernateTemplate] -
Eagerly flushing Hibernate session
2010-11-11 14:29:59,930 DEBUG [org.springframework.orm.hibernate3.SessionFactoryUtils] -
Closing Hibernate Session
2010-11-11 14:29:59,930 DEBUG [org.springframework.orm.hibernate3.SessionFactoryUtils] -
Opening Hibernate Session
Hibernate: select this_.userId as userId0_0_, this_.userName as userName0_0_, this_.nickName as nickName0_0_, this_.regTime as regTime0_0_, this_.loginTimes as loginTimes0_0_, this_.phone as phone0_0_, this_.lastLogin as lastLogin0_0_ from User this_
2010-11-11 14:29:59,955 DEBUG [org.springframework.orm.hibernate3.HibernateTemplate] -
Eagerly flushing Hibernate session
Hibernate: update User set userName=?, nickName=?, regTime=?, loginTimes=?, phone=?, lastLogin=? where userId=?
Hibernate: update User set userName=?, nickName=?, regTime=?, loginTimes=?, phone=?, lastLogin=? where userId=?
2010-11-11 14:29:59,980 DEBUG [org.springframework.orm.hibernate3.SessionFactoryUtils] -
Closing Hibernate Session
如果配置了事务,日志是这样:(注意加粗处session的处理,以及事务的处理)
2010-11-11 14:19:01,645 DEBUG [org.springframework.transaction.support.TransactionSynchronizationManager] -
Initializing transaction synchronization
2010-11-11 14:19:01,645 DEBUG [org.springframework.transaction.interceptor.TransactionInterceptor] -Getting transaction for
[com.supben.service.UserService.saveAndFindAll]
2010-11-11 14:19:01,650 DEBUG [org.springframework.transaction.support.TransactionSynchronizationManager] - Retrieved value [org.springframework.orm.hibernate3.SessionHolder@89e2f1] for key [org.hibernate.impl.SessionFactoryImpl@68cd79]
bound to thread [main]
2010-11-11 14:19:01,650 DEBUG [org.springframework.transaction.support.TransactionSynchronizationManager] - Retrieved value [org.springframework.orm.hibernate3.SessionHolder@89e2f1] for key [org.hibernate.impl.SessionFactoryImpl@68cd79] bound to thread [main]
2010-11-11 14:19:01,650 DEBUG [org.springframework.orm.hibernate3.HibernateTemplate] -
Found thread-bound Session for HibernateTemplate
Hibernate: insert into User (userName, nickName, regTime, loginTimes, phone, lastLogin) values (?, ?, ?, ?, ?, ?)
2010-11-11 14:19:01,680 DEBUG [org.springframework.orm.hibernate3.HibernateTemplate] -
Not closing pre-bound Hibernate Session after HibernateTemplate
2010-11-11 14:19:01,685 DEBUG [org.springframework.transaction.support.TransactionSynchronizationManager] - Retrieved value [org.springframework.orm.hibernate3.SessionHolder@89e2f1] for key [org.hibernate.impl.SessionFactoryImpl@68cd79]
bound to thread [main]
2010-11-11 14:19:01,685 DEBUG [org.springframework.transaction.support.TransactionSynchronizationManager] - Retrieved value [org.springframework.orm.hibernate3.SessionHolder@89e2f1] for key [org.hibernate.impl.SessionFactoryImpl@68cd79] bound to thread [main]
2010-11-11 14:19:01,685 DEBUG [org.springframework.orm.hibernate3.HibernateTemplate] -
Found thread-bound Session for HibernateTemplate
2010-11-11 14:19:01,690 DEBUG [org.springframework.transaction.support.TransactionSynchronizationManager] - Retrieved value [org.springframework.orm.hibernate3.SessionHolder@89e2f1] for key [org.hibernate.impl.SessionFactoryImpl@68cd79]
bound to thread [main]
Hibernate: select this_.userId as userId0_0_, this_.userName as userName0_0_, this_.nickName as nickName0_0_, this_.regTime as regTime0_0_, this_.loginTimes as loginTimes0_0_, this_.phone as phone0_0_, this_.lastLogin as lastLogin0_0_ from User this_
2010-11-11 14:19:01,715 DEBUG [org.springframework.orm.hibernate3.HibernateTemplate] -
Not closing pre-bound Hibernate Session after HibernateTemplate
2010-11-11 14:19:01,715 DEBUG [org.springframework.transaction.interceptor.TransactionInterceptor] - Completing transaction for [com.supben.service.UserService.saveAndFindAll]
2010-11-11 14:19:01,715 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] - Triggering beforeCommit synchronization
2010-11-11 14:19:01,715 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] - Triggering beforeCompletion synchronization
2010-11-11 14:19:01,715 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] - Initiating transaction commit
2010-11-11 14:19:01,715 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] -
Committing Hibernate transaction on Session [org.hibernate.impl.SessionImpl@b86944]
Hibernate: update User set userName=?, nickName=?, regTime=?, loginTimes=?, phone=?, lastLogin=? where userId=?
2010-11-11 14:19:01,745 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] - Triggering afterCommit synchronization
2010-11-11 14:19:01,745 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] - Triggering afterCompletion synchronization
2010-11-11 14:19:01,750 DEBUG [org.springframework.transaction.support.TransactionSynchronizationManager] - Clearing transaction synchronization
2010-11-11 14:19:01,750 DEBUG [org.springframework.transaction.support.TransactionSynchronizationManager] - Removed value [org.springframework.orm.hibernate3.SessionHolder@89e2f1] for key [org.hibernate.impl.SessionFactoryImpl@68cd79] from thread [main]
2010-11-11 14:19:01,750 DEBUG [org.springframework.transaction.support.TransactionSynchronizationManager] - Removed value [org.springframework.jdbc.datasource.ConnectionHolder@1117a20] for key [org.apache.commons.dbcp.BasicDataSource@1192059] from thread [main]
2010-11-11 14:19:01,750 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] - Closing Hibernate Session [org.hibernate.impl.SessionImpl@b86944] after transaction
2010-11-11 14:19:01,750 DEBUG [org.springframework.orm.hibernate3.SessionFactoryUtils] -
Closing Hibernate Session
很容易看到:如果没有配置事务,hibernateDaoSupport采用的是传统的open-per-operation模式。即:打开一个session----执行添加----从内存flush到数据库中----
关闭session----打开一个session----执行查询----flush到数据库中(2条update操作是flush的一部分...)----关闭session
如果配置了,操作过程则是:打开事务----开启一个session并绑定到当前线程中,执行添加----检查是否要关闭session(否)----拿到当前线程的session----执行查询----检查session是否要关闭(是)----提交事务----关闭session。
显然,后者的session管理更科学了,看起来save之后没有调用flush,好像保证不了save之后数据的正确性。其实不是!因为他们是同一个session中,所以仍然不影响结果!
结论:无论数据库支不支持事务,或者说业务需不需要。都用aop的方式对service方法配上事务管理!
这时候,spring会完全负责hibernateDaoSupport中的getSession(),getCurrentSession()以及getHibernateTemplate()三个方法中的session开关。即spring能保证在一个service方法中中只出现一个 hibernate session。在第一次发sql前打开,在最后一次发sql后关闭。
严禁用SessionFactory的openSession()自己获取一个session。这样得到的session无法控制的。
至于openSessionInView。整个request--response的生命周期,一直用一个session,好像没什么很强的必要性,而且带来的负面问题极多,所以不建议使用。
附上:事务的声明式配置方法
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" />
<tx:method name="update*" />
<tx:method name="remove*" />
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="serviceMethod" expression="execution(* com.supben.service.impl.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" />
</aop:config>
分享到:
相关推荐
Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们的整合(SSH)极大地提升了开发效率和项目的可维护性。下面将详细讲解这三大框架的核心功能以及整合过程中的关键知识点。 1. **Struts2**:Struts2是一...
整合Spring MVC、Spring 3和Hibernate 4是一个涉及多个方面的工作,包括配置文件的设置、实体管理器的获取、数据源的配置等。以下是详细的知识点: 1. 工具和版本选择:在搭建Spring+SpringMVC+JPA+Hibernate平台时...
12. **Spring与Struts、Hibernate整合**:如何将这些框架有效地结合起来,构建高性能的企业级应用。 13. **Spring要点总结**:总结Spring框架的核心特性和使用技巧。 #### 扩展知识点 - **报表工具之...
在SSH整合中,如何将Struts与Spring结合使用是一个难点。默认情况下,Struts负责Action类的创建,这与Spring容器的管理方式不符。因此,需要对Struts进行一定的定制。 - **Struts与Spring整合的关键点**: - **...
- **测试代码**: 编写测试代码验证Spring整合Hibernate后的功能。 ##### 6. 模拟Action代理类实现Struts+Spring - **原理介绍**: 通过使用Spring的代理机制来实现Struts Action的动态代理。 - **Map关系**: 使用Map...
本项目结合了Spring 3.1.0M1、Hibernate 3.X以及Struts2.1.8,旨在提供一个最新的整合示例。 Spring作为核心框架,3.1.0M1是其早期的一个里程碑版本,带来了许多改进和新特性。例如,它强化了依赖注入(DI),使得...
第15章:对Spring MVC框架进行详细介绍,对REST风格编程方式进行重点讲解,同时还对Spring 3.0的校验和格式化框架如果和Spring MVC整合进行讲解。 第16章:有别于一般书籍的单元测试内容,本书以当前最具实战的...
10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼 10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC...
SSH整合的难点通常在于配置文件的设置,包括struts-config.xml、spring配置文件(如applicationContext.xml)和hibernate.cfg.xml。每个框架都有自己的配置规则,理解这些配置是成功整合的关键。 对于开发者来说,...
SSH框架整合是Web开发中的一种常见技术组合,主要包括Spring、Struts和Hibernate这三个核心组件。它们各自在应用程序的层面上承担不同的职责,协同工作以构建出高效、灵活且可维护的Java Web应用。 Spring框架是...
本书详细介绍了JavaWeb开发中的三大开发框架Struts、Hibernate与Spring的整合使用。本书内容由浅入深,循序渐进,理论讲解与实践相结合,并列举了大量典型应用实例帮助读者理解开发过程中的重点和难点知识,同时提供...
SSH整合是指在Java Web开发中,将Struts、Spring和Hibernate三个开源框架集成在一起,以实现更高效、更灵活的MVC(Model-View-Controller)架构。这三种技术分别负责视图层、业务逻辑层和数据访问层,通过整合可以...
本书详细介绍了JavaWeb开发中的三大开发框架Struts、Hibernate与Spring的整合使用。本书内容由浅入深,循序渐进,理论讲解与实践相结合,并列举了大量典型应用实例帮助读者理解开发过程中的重点和难点知识,同时提供...
10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼 10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC...
本书详细介绍了JavaWeb开发中的三大开发框架Struts、Hibernate与Spring的整合使用。本书内容由浅入深,循序渐进,理论讲解与实践相结合,并列举了大量典型应用实例帮助读者理解开发过程中的重点和难点知识,同时提供...
本书详细介绍了JavaWeb开发中的三大开发框架Struts、Hibernate与Spring的整合使用。本书内容由浅入深,循序渐进,理论讲解与实践相结合,并列举了大量典型应用实例帮助读者理解开发过程中的重点和难点知识,同时提供...
第15章:对Spring MVC框架进行详细介绍,对REST风格编程方式进行重点讲解,同时还对Spring 3.0的校验和格式化框架如果和Spring MVC整合进行讲解。 第16章:有别于一般书籍的单元测试内容,本书以当前最具实战的...
详细介绍了JavaWeb开发中的三大开发框架Struts、Hibernate与Spring的整合使用。本书内容由浅入深,循序渐进,理论讲解与实践相结合,并列举了大量典型应用实例帮助读者理解开发过程中的重点和难点知识,同时提供了...
在SSH整合中,Spring作为“粘合剂”,协调Struts和Hibernate的工作。 3. **Hibernate框架**:Hibernate 是一个强大的ORM(Object-Relational Mapping)框架,它可以将Java对象映射到数据库表,从而简化了数据库操作。...
#### 四、整合难点及解决方案 整合SSH和JBPM的过程中,可能会遇到以下关键问题: 1. **数据库Session不一致**:JBPM默认使用的Session与现有的Hibernate Session不一致,需要统一。 2. **大字段处理**:处理字符串...