最近看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层。
不知道大家有木有遇到过类似现象,有好的建议希望不吝赐教啊
分享到:
相关推荐
在SpringMVC中,用户请求的数据通常会被封装在Model中,并通过Controller返回给视图(View),最后展示给用户。而视图的作用就是将模型数据以合适的方式展示给用户。 在创建基于SpringMVC的Web应用程序时,需要在...
SpringMVC提供了一系列的注解,如`@Controller`、`@RequestMapping`等,让开发者可以更方便地编写控制器,处理HTTP请求。 `Ajax`(Asynchronous JavaScript and XML)是一种在不刷新整个页面的情况下,通过...
在Spring MVC中,Controller类通常使用@Controller注解标识,并且可以包含多个处理请求的方法,这些方法通过@RequestMapping或其变体进行映射。 例如,假设我们有一个名为`UserController`的Controller类,我们可以...
@Controller public class UserController { @Autowired private UserService userService; @Transactional public void createUser(User user) { userService.saveUser(user); userService....
2. **注解驱动的 Controller**:Spring MVC 使用注解来简化配置,如 `@RestController` 和 `@Controller`。`@RestController` 适用于 RESTful 风格的应用,它结合了 `@Controller` 和 `@ResponseBody`,意味着返回值...
2. 确保@Transactional注解的使用位置正确,它只能在受Spring管理的bean(如@Controller、@Service、@Repository)的方法上生效。 3. 检查事务的传播行为,默认是REQUIRED,可能需要根据业务需求调整。 4. 注意@...
在 SpringMVC 中,提供了一个非常简便的定义 Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用 @Controller 标记一个类是 Controller,然后使用 @RequestMapping 和 @RequestParam 等一些注解用以...
在SpringMVC中,我们使用`@Controller`注解来标识一个类作为控制器。例如,你可以创建一个名为`HelloController`的类,并添加`@RequestMapping`注解来处理特定的URL请求。如下所示: ```java @Controller public...
但是,在使用SpringMVC时,常见的一个问题是Controller 接收页面传递的中文参数出现乱码。这种情况下,Controller 无法正确地接收和处理中文参数,导致程序出现错误。那么,如何解决这个问题呢? 解决方法: ...
然后,在 TestController 中,我们继承了 BaseController 超类,可以直接使用 request 和 response 对象。 在 SpringMVC 中获取 Request 对象有多种方法,但这两种方法是最常用的。无论是使用 RequestContextHolder...
常用注解:@Controller @RestController(Controller+ResponseBody) @Service @Transactional @Mapper @AutoWired @RequestMapping--路由 @RequestParam--参数绑定(不同名参数或Map<Object,String>) @...
在Controller层,根据业务需求,调用对应的Service方法,Service方法中通过`@Transactional`注解来指定使用哪个数据源。 7. **注意点** - 确保数据库驱动已添加到项目依赖。 - 在实际业务中,可能需要根据具体...
接下来,我们可以在SpringMVC的Controller层使用@Autowired注解注入Mapper接口的实现,这样就可以直接调用接口中的方法执行数据库操作。例如,我们可以定义一个UserMapper接口,包含获取用户信息的selectUser方法,...
在这里,我们使用了`@Controller`注解来标记Controller类,并使用`@RequestMapping`注解来映射请求URL。 2. ajax请求的工作原理:ajax(Asynchronous JavaScript and XML)是一种异步请求技术,允许Web页面在不刷新...
在Service层的类或者方法上使用@Transactional注解,可以声明该方法需要在事务中执行。例如: ```java @Service public class UserService { @Transactional public void createUser(User user) { // ...
例如,我们可以在 Controller 中使用 `@RequestMapping` 注解,并添加 `produces` 属性来指定字符编码: ```java @RequestMapping(value = "/hello", produces = "text/html;charset=UTF-8") public String hello()...
在使用注解的SpringMVC中,我们通常会使用@Controller、@RequestMapping等注解来标记控制器类和处理请求的方法。 1. **控制器(Controller)**:使用`@Controller`注解标记类,表明这个类是一个处理HTTP请求的控制...
在上面的代码中,我们使用了`@Controller`注解来标记ControlFlight类是一个Controller接口,然后使用`@RequestMapping`注解来指定该Controller接口的请求映射。 三、SimpleUrlHandlerMapping的作用 ...
默认情况下,如果项目中包含Jackson库,SpringMVC会使用`MappingJackson2HttpMessageConverter`作为MessageConverter,实现JSON序列化。 5. 配置SpringMVC以使用Jackson: 虽然SpringMVC通常会自动检测并使用...
通常,Controller类会使用@Controller注解标识,而处理方法则使用@RequestMapping、@GetMapping、@PostMapping等注解进行请求映射。 2. **模型数据和视图解析**:Controller处理完请求后,可能会需要返回数据到视...