- 浏览: 270696 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
hongxingyaru_d5b032:
但是其中“这个Accept和Request Headers中的 ...
基于Spring MVC的Web应用开发(7) - Headers -
hongxingyaru_d5b032:
学习到了,感谢分享!
基于Spring MVC的Web应用开发(7) - Headers -
bo_hai:
总结的不错。
基于Spring MVC的Web应用开发(7) - Headers -
fendou3754:
那你也说一下spring-asm重新打包以后的源码怎么获取,尽 ...
spring将spring-asm重新打包原因 -
di1984HIT:
谢谢啊~学习了~~
JMS、AMQP实例讲解
SpringSource与2011年6月8号发布了Spring 3.1.0 M2,TEAM BLOG与6月9号和6月10号连续发布两篇博文Spring Framework 3.1 M2 released,Spring 3.1 M2: Configuration Enhancements来介绍。这其中Chris Beans的文章介绍了如何整合Hibernate,说在M2中新引入了一个类AnnotationSessionFactoryBuilder来简化code-based的Spring配置方式。结合到具体项目中:
@Configuration @EnableTransactionManagement public class DataConfig { @Inject private Environment environment; @Inject private DataSource dataSource; @Bean public JdbcTemplate jdbcTemplate() { return new JdbcTemplate(dataSource); } @Bean public SimpleJdbcInsert simpleJdbcInsert() { return new SimpleJdbcInsert(dataSource); } // 3.1.0.M2 @Bean public SessionFactory sessionFactory() throws Exception { Properties hibernateProperties = new Properties(); hibernateProperties.put("hibernate.dialect", environment.getProperty("hibernate.dialect")); hibernateProperties.put("hibernate.show_sql", environment.getProperty("hibernate.show_sql")); hibernateProperties.put("hibernate.generate_statistics", environment.getProperty("hibernate.generate_statistics")); hibernateProperties.put("hibernate.format_sql", environment.getProperty("hibernate.format_sql")); return new AnnotationSessionFactoryBuilder() .setDataSource(dataSource) .setPackagesToScan(environment.getProperty("hibernate.packagesToScan") .setHibernateProperties(hibernateProperties) .buildSessionFactory(); } @Bean public PlatformTransactionManager transactionManager() throws Exception { HibernateTransactionManager bean = new HibernateTransactionManager(); bean.setSessionFactory(sessionFactory()); return bean; } @Configuration @Profile("dev") static class Development { @Inject private Environment environment; @Bean(destroyMethod="close") public DataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(environment.getProperty("jdbc.driverClassName")); dataSource.setUrl(environment.getProperty("jdbc.url")); dataSource.setUsername(environment.getProperty("jdbc.username")); dataSource.setPassword(environment.getProperty("jdbc.password")); return dataSource; } } }
但是经过测试,这样配置在service方法抛出异常后事务是不能回滚的!
问题似乎在最近刚出的RC1版本中得到了修正,在RC1版本中,AnnotationSessionFactoryBuilder类已经悄然从发布包中移除了,于是我们只能使用原始的AnnotationSessionFactoryBean类来配置:
@Configuration @EnableTransactionManagement public class DataConfig { @Inject private Environment environment; @Inject private DataSource dataSource; @Bean public JdbcTemplate jdbcTemplate() { return new JdbcTemplate(dataSource); } @Bean public SimpleJdbcInsert simpleJdbcInsert() { return new SimpleJdbcInsert(dataSource); } // 3.1.0.RC1 @Bean public IdTransferringMergeEventListener merge() { IdTransferringMergeEventListener bean = new IdTransferringMergeEventListener(); return bean; } @Bean public AnnotationSessionFactoryBean annotationSessionFactoryBean() { Properties hibernateProperties = new Properties(); hibernateProperties.setProperty("hibernate.dialect", environment.getProperty("hibernate.dialect")); hibernateProperties.setProperty("hibernate.show_sql", environment.getProperty("hibernate.show_sql")); hibernateProperties.setProperty("hibernate.generate_statistics", environment.getProperty("hibernate.generate_statistics")); hibernateProperties.setProperty("hibernate.format_sql", environment.getProperty("hibernate.format_sql")); AnnotationSessionFactoryBean bean = new AnnotationSessionFactoryBean(); bean.setDataSource(dataSource); bean.setPackagesToScan(new String[] { environment.getProperty("hibernate.packagesToScan") }); bean.setHibernateProperties(hibernateProperties); // optional Map<String, Object> eventListeners = new HashMap<String, Object>(); eventListeners.put("merge", merge()); bean.setEventListeners(eventListeners); return bean; } @Bean public PlatformTransactionManager transactionManager() { HibernateTransactionManager bean = new HibernateTransactionManager(); bean.setSessionFactory(annotationSessionFactoryBean().getObject()); return bean; } @Configuration @Profile("dev") static class Development { @Inject private Environment environment; @Bean(destroyMethod="close") public DataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(environment.getProperty("jdbc.driverClassName")); dataSource.setUrl(environment.getProperty("jdbc.url")); dataSource.setUsername(environment.getProperty("jdbc.username")); dataSource.setPassword(environment.getProperty("jdbc.password")); return dataSource; } } }
经过测试,这样的配置事务是可以回滚的。因为官方JIRA中没有找到对应的BUG列表,只能揣测开发团队内部发现此问题,但是有点想不明白为什么当初要“隆重”的介绍这个AnnotationSessionFactoryBuilder类出场。
然后很自然地联想到,如果直接在M2版本中使用上面这个RC1版本的配置,事务是否能回滚?答案是能回滚。
最后注意到在SPRING FRAMEWORK 3.1 RC1 RELEASED一文中有个叫Tobias的也注意到了AnnotationSessionFactoryBuilder类从RC1版中移除了,不知道他之前有没有碰到事务失效的问题?XD
补充(2011.10.22 15:10):
通过P6SPY抓取底层JDBC发送给数据库的sql发现有差异,如下:
事务失效
20111022 15:05:00,429|2|1|statement|insert into t_primary_keys(pk_key, pk_value) values('t_teacher', 0) 20111022 15:05:00,434|4|1|statement|update t_primary_keys set pk_value = 1 where pk_value = 0 and pk_key = 't_teacher' 20111022 15:05:00,436|1|1|commit| 20111022 15:05:00,442|1|1|statement|update t_primary_keys set pk_value = 2 where pk_value = 1 and pk_key = 't_teacher' 20111022 15:05:00,443|0|1|commit| 20111022 15:05:00,472|1|1|statement|insert into t_primary_keys(pk_key, pk_value) values('t_student', 0) 20111022 15:05:00,477|5|1|statement|update t_primary_keys set pk_value = 1 where pk_value = 0 and pk_key = 't_student' 20111022 15:05:00,492|15|1|commit| 20111022 15:05:00,494|0|1|statement|update t_primary_keys set pk_value = 2 where pk_value = 1 and pk_key = 't_student' 20111022 15:05:00,495|0|1|commit| 20111022 15:05:00,523|3|1|statement|insert into t_teacher (name, id) values ('teacher', 1) 20111022 15:05:00,535|11|1|statement|insert into t_student (name, id) values ('sssssssssssssssssssssss', 1)
事务成功
20111022 15:09:01,162|1|1|statement|update t_primary_keys set pk_value = 3 where pk_value = 2 and pk_key = 't_teacher' 20111022 15:09:01,163|1|1|commit| 20111022 15:09:01,186|1|1|statement|update t_primary_keys set pk_value = 3 where pk_value = 2 and pk_key = 't_student' 20111022 15:09:01,187|1|1|commit| 20111022 15:09:01,214|2|0|statement|insert into t_teacher (name, id) values ('teacher', 2) 20111022 15:09:01,226|11|0|statement|insert into t_student (name, id) values ('sssssssssssssssssssssss', 2) 20111022 15:09:01,240|1|0|rollback|
从中不难看出,事务成功的sql中发出了rollback,而事务失效的既没有发出rollback,也没有发出commit,这个时候jdbc链接是否释放,存不存在内存泄漏的情况暂时不得而知,等以后有时间在深入研究一下。
评论
Spring Framework Reference Documentation(http://static.springsource.org/spring/docs/3.1.0.RELEASE/reference/htmlsingle/)就是最好的参考文档,另外SpringSource Team Blog的3.1的Category也很不错(http://blog.springsource.org/category/spring/31/page/2/)。
当我换成jdbcTemplate后,无论update跟insert的SQL都是照样执行,没有事务
@Transactional
public void testInsert() {
//jdbcTemplate.update("insert into book (title) values ('testInsert')");
Book aBook =new Book();
aBook.setTitle("33333");
getSession().save(aBook);
throw new RuntimeException("运行期例外");
}
你能不能也这样跑一次看看,是不是支持insert还需要别的配置,还有JdbcTemplate还需要再配置
而eventListeners.put("merge", merge());其实跟事务没有什么关系哈
可参考:http://static.springsource.org/spring/docs/3.1.0.RELEASE/javadoc-api/org/springframework/orm/hibernate3/support/IdTransferringMergeEventListener.html
发表评论
-
《Pro Spring Integration》读书笔记
2012-06-02 11:30 0a -
基于Spring MVC的Web应用开发(12) - Form
2012-03-31 14:50 5977本节介绍SpringMVC中的表单,demo演示访问一个表单提 ... -
基于Spring MVC的Web应用开发(11) - Views
2012-03-31 13:13 8799在FileUpload一文中,我们初步了解了SpringMVC ... -
基于Spring MVC的Web应用开发(10) - Validation
2012-03-31 11:36 3173本文介绍SpringMVC的验证(validation),在C ... -
基于Spring MVC的Web应用开发(9) - Exceptions
2012-03-31 10:55 1768本文介绍SpringMVC中的异常处理,@Controller ... -
基于Spring MVC的Web应用开发(8) - Convert
2012-03-31 09:25 3679本文介绍SpringMVC中的Convert,Convert是 ... -
基于Spring MVC的Web应用开发(7) - Headers
2012-03-30 15:01 27360本文接上一篇文章,介 ... -
基于Spring MVC的Web应用开发(6) - Response
2012-03-30 10:56 36096本文讲解Spring MVC的Response,深入了解一下@ ... -
基于Spring MVC的Web应用开发(5) - Redirect
2012-03-26 15:10 17537本文介绍Spring MVC中的重定向(Redirect),先 ... -
基于Spring MVC的Web应用开发(4) - FileUpload
2012-03-20 21:17 35759上一篇文章介绍了Spring MVC如何处理静态资源文件,本文 ... -
基于Spring MVC的Web应用开发(3) - Resources
2012-03-20 16:22 6614上一篇介绍了在基于Spring MVC的Web项目中加入日志, ... -
基于Spring MVC的Web应用开发(2) - Log
2012-03-19 11:55 3591上一篇文章我们使用SpringMVC搭建了一个简单WEB项目 ... -
基于Spring MVC的Web应用开发(1) - HelloWorld
2012-03-16 07:21 18286MVC架构 MVC是模型(model),视图(view),控 ... -
spring-oxm中unmashaller疑似bug
2012-03-08 10:21 2558spring-integration中测试XML Transf ... -
spring将spring-asm重新打包原因
2012-03-06 13:41 8280以前就发现通过eclipse上面的m2e插件不能将spring ... -
Spring底层使用SAX解析XML配置文件
2012-02-29 01:28 6131最近在研究Spring源代码,在梳理spring-beans时 ...
相关推荐
Spring3.1.0.M2版本引入了若干改进,如对Java配置的支持,增强了对JPA和Hibernate的整合,以及改进的事务管理。Spring的IoC容器使得对象之间的依赖关系可以通过XML或注解来声明,降低了代码的耦合度。 **Hibernate...
本文将深入探讨这三者在Struts2.2.3、Spring3.1.0.M2和Hibernate3.6.6版本下的整合细节。 ### Struts2.2.3 Struts2是基于Servlet的MVC框架,提供了丰富的插件和拦截器机制,使得开发者能够轻松构建Web应用程序。在...
GSH:spring3.1.0M2+Hibernate3.5+GWT2.4+JPA+Annotation+Spring4gwt0.0.1亲手整合,也可以上新浪博客去看 http://blog.sina.com.cn/s/blog_687dfecb0100yrmf.html
在3.1.0.M2版本中,IoC容器提供了更强大的元数据支持,包括基于注解的配置,使得配置更为简洁。 2. **AOP(Aspect Oriented Programming,面向切面编程)**:Spring的AOP模块允许开发者定义“切面”,这些切面可以...
本篇将聚焦于Spring Framework 3.1.0.M2版本,探讨其核心特性、改进以及在实际项目中的应用。 1. **Spring概述** Spring Framework是一个全面的企业级应用开发框架,它通过依赖注入(Dependency Injection,DI)和...
标题中的"spring3.1.o.m2 dist"指的是Spring框架的3.1版本的一个特定发行版,其中"dist"通常代表“distribution”,意味着这是一个包含了所有发布文件的集合,供用户下载和使用。在这个上下文中,"o"可能是遗漏或者...
"org.springframework.spring-library-3.1.0.M2.lib"可能是Spring框架的库文件,包含所有Spring模块的类和资源,版本号3.1.0.M2意味着这是一个预发布版本,可能在正式版之前用于测试和评估。 在SSH集成中,Spring...
通过研究Spring 3.1.0.M2的源码,开发者可以学习到如何在实际项目中使用Spring,比如自定义拦截器、事务管理、数据访问策略等,从而提高开发效率和代码质量。 总的来说,Spring 3.1.0.M2的源码集合是一个宝贵的...
`org.springframework.context-3.1.0.M2.jar`和`org.springframework.beans-3.1.0.M2.jar`以及`org.springframework.web.servlet-3.1.0.M2.jar`是Spring的核心模块,分别负责上下文管理、Bean管理和Web MVC层。...
这是一个Dynamic Web Project,主要使用hibernate和spring框架,其中事务管理使用的是注解。 hibernate的版本:hibernate-distribution-3.6.6.Final; spring的版本:spring-framework-3.1.0.M2 。 注意:此项目没有...
标题中的“ssh 整合 spring jar”指的是在Java Web开发中,将Spring框架集成到Struts2(S)和Hibernate(H)组成的SSH框架中的过程。SSH是Java领域常用的MVC(Model-View-Controller)架构的三位一体框架,而Spring...
在Spring项目中,如果使用Hibernate作为ORM工具,这个JAR文件就是必不可少的,它包含了Hibernate的核心类和接口。 2. **aspectjweaver.jar**:AspectJ是一个面向切面编程(AOP)的框架,Spring使用它来实现声明式...
在Spring Framework 3.1.0.M2版本中,我们可以深入理解其核心机制和设计理念。 首先,Spring的核心组件包括IoC(Inversion of Control,控制反转)容器和AOP(Aspect Oriented Programming,面向切面编程)。IoC...
5. 框架版本:Struts2.2.3.1、Spring3.1.0.M2、Hibernate4.0.0.CR4 6. FlashBuilder插件:FlashBuilder_4_Plugin_LS10 二、项目构建 1. 创建Web项目:名为`s2shFlex`,选择Java EE5.0标准。 2. 配置数据库:在...
这是一个Dynamic Web Project,主要使用hibernate和spring框架,其中事务管理使用的是注解。 hibernate的版本:hibernate-distribution-3.6.6.Final; spring的版本:spring-framework-3.1.0.M2 。
3. **构建整合案例**:在实际项目中,经常需要整合 Spring、Hibernate 等框架。通过 Maven 可以轻松地引入这些框架的依赖,并通过配置实现不同组件之间的集成。 #### Maven 工程目录结构 Maven 工程遵循固定的目录...
利用struts(struts-2.2.3.1)+hibernate(hibernate-distribution-3.6.4.Final)+spring(spring-framework-3.1.0.M2)+MySQL框架简单的编写了一个网上商城的小系统,作为熟悉3大最新框架流程之用,
离线依赖包通常包括大量的JAR文件,这些文件对应了各种开源库,如Spring、Hibernate、Apache Commons等。在使用Maven离线依赖包时,开发者需要将repository_2文件夹解压到本地Maven仓库目录下,通常是用户目录下的....
org.springframework.aop-3.1.0.M2.jar oro-2.0.8.jar oval-1.31.jar plexus-container-default-1.0-alpha-10.jar plexus-utils-1.2.jar poi-3.12-20150511.jar poi-ooxml-3.12-20150511.jar poi-ooxml-schemas-3.12...