最近看mybatis的时候做了一个练习,但是进行事务处理的时候出了问题,如下
package com.henu.lz.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.henu.lz.dao.PersonMapper;
import com.henu.lz.model.Person;
@Controller
public class SupplierController {
@Autowired
PersonMapper personMapper;
@Transactional
@RequestMapping("/add")
public String addPerson(
@RequestParam("name1") String name1,
@RequestParam("age1") int age1,
@RequestParam("name2") String name2,
@RequestParam("age2") int age2,
Model model) {
Person person1 = new Person();
Person person2 = new Person();
person1.setName(name1);
person1.setAge(age1);
person2.setName(name2);
person2.setAge(age2);
personMapper.save(person1);
personMapper.save(person2);
model.addAttribute("message", "添加成功!");
return "success";
}
}
spring容器和springmvc的配置都没有问题,dao层就是mybatis比较与众不同的的写有sql的xml以及接口。在从前台传值的时候person1正常传,person2传能抛SQLException的值,按理说事务应该回滚的,数据库中不会有person1,但是查看数据库却有person1。用的mysql,引擎设置为innodb后还是这样,换了oracle之后依然如此。这两次save不在一个事务。
网上看了下别人的经历,有的是try…catch之后自行处理没有throw,有的是说设置rollbackFor……有一个比较接近
http://www.iteye.com/topic/714686
用的是 hibernate 3.2,在配置dao和controller的时候都用了注解方式自动扫描
<context:component-scan base-package="com..." />
这样说是导致dao中事务无效,我试过这样配置,服务启动直接就出错了,很显然冲突,而且用context:include-filter和context:exclude-filter来屏蔽掉controller层的解决办法也有点没必要,分别扫描dao层和controller层不就行了,我是这样配置的。
查看mybatis官网上的project,是比我多了一层service层,然后在service中用的@transactional,我加了一层
package com.henu.lz.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.henu.lz.dao.PersonMapper;
import com.henu.lz.model.Person;
@Service(value="personService")
public class PersonServiceImpl implements PersonService {
@Autowired
private PersonMapper personMapper;
@Transactional
public void save(Person p1, Person p2) {
personMapper.save(p1);
personMapper.save(p2);
}
}
相应的,controller也修改为
package com.henu.lz.controller;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.henu.lz.model.Person;
import com.henu.lz.service.PersonService;
@Controller
public class SupplierController {
@Resource
private PersonService personService;
@RequestMapping("/add")
public String addPerson(
@RequestParam("name1") String name1,
@RequestParam("age1") int age1,
@RequestParam("name2") String name2,
@RequestParam("age2") int age2,
Model model) {
Person person1 = new Person();
Person person2 = new Person();
person1.setName(name1);
person1.setAge(age1);
person2.setName(name2);
person2.setAge(age2);
personService.save(person1, person2);
model.addAttribute("message", "添加成功!");
return "success";
}
}
这时再按开始那样传值能得到预期结果了。
一开始也注意到少了一层service,但是觉得在controller中做同样的事情也可以的,所以就杯具了。
因为spring的context和mvc是分开的,貌似controller不能被注册到spring的context中,于是不能被transactionManager拦截,那么controller中那个@transactional就不起作用了。看了声明式事务的五种配置,都是对注册到context中的bean起作用的,不论是拦截器方式还是aop:config方式。
事务注解方式不能应用于接口,我的mapper用的又是xml方式的,所以只能加一层service,然后controller中的交易就放在service层。
不知道大家有木有遇到过类似现象,有好的建议希望不吝赐教啊
分享到:
相关推荐
java-mybatis、springmvc 整合,使用 @Transactional 时遇到的事务相关问题
@RequestMapping注解可以使用请求URL、请求方式、请求参数、请求头和带占位符的URL等方式来映射请求;且包括REST与HiddenHttpMethodFilter相关内容
弹簧 @Controller @RequestMapping @RequestParam,模型和ModelAndView Spring MVC实践
模拟了基本前端与后端交互JSon数据,使用了Java语言+Maven+SpringMVC+Ajax @RequestBody+Json传输完成基本数据交互
springmvc controller
SpringMVC4.0 一个Controller多个方法
springmvc关于@requestMapping和@requestParam的使用,详细代码,独立可用无需修改。
NULL 博文链接:https://sharpspeed.iteye.com/blog/1098367
NULL 博文链接:https://bijian1013.iteye.com/blog/2310240
springmvc controller
springmvc controller
常用注解:@Controller @RestController(Controller+ResponseBody) @Service @Transactional @Mapper @AutoWired @RequestMapping--路由 @RequestParam--参数绑定(不同名参数或Map<Object,String>) @...
搭建SpringMVC模型,包含控制层(@Controller)、 业务逻辑层Service(@Service)、持久层(@Repository)三层注入方式。
Spring MVC AOP通过自定义注解方式拦截Controller等实现日志管理, springMVC里做添加AOP拦截,用于捕获异常。
SpringMVC使用@ResponseBody.rar
下面小编就为大家分享一篇解决SpringMVC Controller 接收页面传递的中文参数出现乱码的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
主要介绍了SpringMVC restful 注解之@RequestBody进行json与object转换的相关资料,需要的朋友可以参考下
SpringMVC笔记内容:第一天(SpringMVC的概述、SpringMVC与Struts2优势分析、重要组件、运行原理、SpringMVC环境搭建、@RequestMapping注解详解、字符编码过滤器、传参形式(基本数据类型或String、对象类型、对象....
模拟springMVC跳转的源代码,实现了@Controller,@RequestMapping
springmvc上传文件controller,vue