- 浏览: 998982 次
文章分类
最新评论
-
18335864773:
很多公司项目 都在使用pageoffice 来操作word,e ...
用java生成word文档 -
Gozs_cs_dn:
请问下博主, 怎样将sitemesh3.xsd绑定 sitem ...
SiteMesh3配置 -
Rose_06:
springside4.0quick-start.bat报错原因 -
ilemma:
我也是刚参见工作啊,经理让自学这个,有些东西不太懂,能不能发个 ...
Apache Shiro在Web中的应用 -
shanbangyou:
你废了
程序员上班打酱油的方法
1、问题复现
spring 3.0 + hibernate 3.2
spring mvc使用注解方式;service使用@service注解 事务使用@Transactional
事务配置使用
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
在插入或更新数据时,无报错,但数据库中无结果,而查询正常。疑为事务未提交。
2、问题检查
当修改dao层实现逻辑为:
- Assert.notNull(entity, "entity不能为空");
- Transaction ts = getSession().beginTransaction();
- getSession().saveOrUpdate(entity);
- getSession().flush();
- ts.commit();
- logger.debug("save entity: {}", entity);
Assert.notNull(entity, "entity不能为空"); Transaction ts = getSession().beginTransaction(); getSession().saveOrUpdate(entity); getSession().flush(); ts.commit(); logger.debug("save entity: {}", entity);
可以正常提交插入、更新。确定为事务未提交。
3、问题分析
spring mvc使用注解方式时需要使用
<context:component-scan base-package="com.fengzhiyin" />
方式用来扫描该包以及其子包下的@Controller注解的类,纳入spring管理,而同时spring 容器也需要使用这种方式扫描包含@Service、@Components、@Required、@Autowired等注解用来管理bean和完成DI。
<context:component-scan base-package="com.fengzhiyin" />
出现在spring mvc的配置文件中时,web 容器在扫描包含@Service或@Components的类并包含@Transaction是,此时@Transaction并为完成,导致事务未被注册。
4、问题解决
分两部分扫描:
spring-mvc.xml中扫描controller
application.xml中扫描其他的
mvc 的只扫描controller组件 注意使用 use-default-filters="false"
<context:component-scan base-package="com.fengzhiyin" use-default-filters="false" >
<context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>
主体的扫描除controller外的所有组件
<context:component-scan base-package="com.fengzhiyin" >
<context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>
经调试代码发现:
1、如果不设置use-default-filters="false",则Spring会扫描并优先注册默认的bean(当然包括标记为@Service的bean),这样,标记为@Transactional的service由于transaction manager尚未注册而未能生效,导致事务管理失效。
原理是:标记为@Transactional的service会wrap为经过transactional proxied(不管是CGLIB based或是JDK based)的bean,而不再是纯的service;
2、app的context-scan其实无所谓,但exclude掉controller显然会improve efficiency.
示例源代码:http://www.xmsydw.com
评论
或者加我QQ:554836620,谢谢了
发表评论
-
SpringMVC使用@ResponseBody中文乱码
2012-03-31 11:45 3099Spring3.0 MVC @ResponseBody 的 ... -
spring mvc 3 上传文件
2012-03-30 16:31 1267spring mvc 支持web应用程序的文件上传功能,是由 ... -
基于Spring框架的Shiro配置
2011-10-26 15:39 3159一、在web.xml中添加shiro过滤器 < ... -
spring3 混合使用 XML 与注解(Annotation)进行 Bean 的配置
2011-10-21 17:34 3666设计 @Configuration 和 @Bean 的初衷,并 ... -
springMVC最佳实践-基于注解的Controller
2011-10-13 23:09 915在spring 2.5发布之后,基于注解的Controller ... -
springmvc3-hibernate-crud例子
2011-10-12 23:45 655http://java.dzone.com/articles/ ... -
ExtJS, Spring MVC 3 and Hibernate 3.5: CRUD例子
2011-10-12 23:45 1304http://loianegroner.com/2010/09 ... -
spring mvc3 annotation例子
2011-10-12 23:43 1883服务端数据到客户端1.返回页面,Controller中方法返回 ... -
Spring Web MVC框架学习笔记
2011-10-12 21:22 2239spring-framework-reference中文版摘录 ... -
Mastering Spring MVC 3中文版
2011-10-11 23:00 3203Mastering Spring MVC 3中文版 精通Sp ... -
基于Myeclipse9.1的spring3.1MVC开发搭建
2011-10-01 14:27 2014(1)配置基础装备。每个符合Java EE规范的web应用程 ... -
Spring Security 设置session
2011-04-02 15:26 3919使用SecurityContextHolder来偷窥登入帐号密 ... -
springsecurity的URL过滤和全局过滤
2011-03-31 15:55 4820springsecurity的URL过滤和全局过滤 最近有个需 ... -
权限控制:spring 3.0 security配置例子
2011-03-31 15:21 1945我几年前自己写过一个 ... -
SpringSide 3 中的 Struts 2
2011-03-03 18:01 910在SpringSide 3 中,使用的MVC框架是Struts ... -
springside 中 报 org.hibernate.MappingException: Unknown entity: XXX
2011-03-03 17:25 1253org.hibernate.MappingException: ... -
springside 迁移sqlserver数据库报错
2011-03-02 16:55 822报错信息: java.lang.AbstractMethodE ... -
使用SpringSide 3.1.4.3开发Web项目的全过程(上)
2011-03-01 17:41 1142http://www.blogjava.net/youxia/ ... -
][SQLServer]第 1 行: '@P1' 附近有语法错误这样的错误
2009-04-16 12:39 2949分页代码时 用sqlserver2000 select ... -
三种SQL分页法
2009-04-14 21:57 6781.分页方案一:(利用Not In和SELECT TOP分页) ...
相关推荐
5. **事务管理器配置**:使用`@Transactional`注解进行声明式事务管理,配置事务管理器`txManager`: ```xml <tx:annotation-driven transaction-manager="txManager" /> <bean id="txManager" class="org.spring...
- **声明式事务管理**:通过在配置文件或注解中定义事务边界,简化了事务管理的复杂度。 - **编程式事务管理**:通过TransactionTemplate或PlatformTransactionManager接口直接管理事务。 ```java @Transactional ...
本文主要介绍如何使用基于注解的方式构建Spring MVC与Hibernate相结合的应用程序。这种方式不仅简化了配置过程,而且提高了开发效率。我们将通过一个具体的示例项目来了解整个流程。 #### 开发环境与工具 - **开发...
1. 配置Spring的`<tx:annotation-driven>`:在Spring的配置文件(如`applicationContext.xml`)中,添加如下代码,启用基于注解的事务管理: ```xml <tx:annotation-driven transaction-manager=...
Spring提供了声明式事务管理,可以方便地控制事务的边界: ```xml <tx:annotation-driven transaction-manager="transactionManager"/> <bean id="transactionManager" class="org.springframework.orm.hibernate4...
5. **事务管理**:Spring提供了声明式事务管理,可以在`<tx:annotation-driven>`元素中配置,使@Transactional注解生效。这样,你可以直接在需要事务的方法上加上该注解,由Spring自动管理事务的开始、提交或回滚。 ...
在Spring的配置文件中,我们通常会定义一个`<tx:annotation-driven>`元素来启用基于注解的事务管理。例如: ```xml <tx:annotation-driven transaction-manager="transactionManager"/> ``` 这里,`...
Spring提供了多种事务管理方式,从编程式事务管理到声明式事务管理,为开发者提供了灵活的选择。"springmvc事务配置到controller.zip"这个压缩包很可能包含了关于如何在Spring MVC的Controller层配置事务管理的示例...
在SSH项目中,Spring的事务管理通过AOP(面向切面编程)来实现,允许开发者声明式地控制事务边界,无需在代码中显式调用开始事务、提交事务或回滚事务等操作。 接下来,我们将介绍如何在Spring配置文件中设置事务...
例如,我们可以使用`<tx:annotation-driven>`元素启用基于注解的事务管理,并在服务层的方法上添加@Transactional注解来开启事务。此外,还可以在Spring配置文件中手动定义PlatformTransactionManager bean,如...
在配置文件中,注释应详细说明每个元素的作用,例如在Spring的配置文件中,`<tx:annotation-driven>`的`transaction-manager`属性指定哪个事务管理器处理事务,`proxy-target-class="true"`表示使用CGLIB代理而不是...
-- 使用声明式事务 --> <tx:annotation-driven transaction-manager="transactionManager"/> </beans> ``` 综上所述,Struts、Spring 和 Hibernate 三者的集成可以有效地构建出功能强大且易于维护的企业级应用。...
2. **事务管理**:Spring提供声明式事务管理,通过`<tx:annotation-driven>`启用基于注解的事务管理,或在配置文件中手动配置事务规则。 3. **DAO层的实现**:Spring的`HibernateTemplate`或`HibernateOperations`...
在Spring 3.0中,事务管理可以通过声明式方式实现,这通常涉及到在XML配置文件中定义`<tx:annotation-driven>`元素来启用事务管理。在与Hibernate集成时,Spring的PlatformTransactionManager接口的实现,如...
- **XML配置**:通过`<bean>`标签配置`SessionFactory`,`<tx:annotation-driven>`启用事务注解。 - **Java配置**:使用`@Configuration`、`@EnableTransactionManagement`等注解实现相同功能。 - **Service层**...
<tx:annotation-driven transaction-manager="transactionManager"/> <!-- Action类的配置 --> <bean id="userAct" class="com.zhuo.action.UserAct"> <property name="userService" ref="userService"/> </...
<tx:annotation-driven transaction-manager="transactionManager"/> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ...
可以通过声明式事务管理来简化事务的配置和管理,如使用 `<tx:annotation-driven />` 开启基于注解的事务管理。此外,也可以通过编程式事务管理来手动控制事务的开始、提交和回滚。 以上内容涵盖了 Struts、Spring ...