我正在使用Spring data jpa
和spring mvc
而且我注意到我的对象contact
会自动在数据库中更新。
这是我的代码:
@Transactional
@Controller
public class ContactController {
@RequestMapping(value="/update_contact ")
public @ResponseBody
String update_contact (...) {
...
Contact contact = contactrespository.findOne(idcontact);
contact.setName(...);
...
}
}
当我检查数据库时,未执行contactrespository.save(idcontact);
我的contact
已被更改!
你能解释一下为什么吗?
答案 0 :(得分:3)
对象有很多states:
在此上下文中,更改将提交到联系,因为它是在事务中已修改的持久对象,因为您的控制器使用@Transactional
注释,因此它与Hibernate会话关联。
使用Controller
注释注释Transactional
不是一个好习惯,最好在我们调用repository
而不是在控制器层中的服务层上使用
@Controller
public class MyController{
@Autowired
private MyService service;
@RequestMapping ....
public Contact findContact(String name, ....){
Contact contact = service.get(...);
// other logic
}
}
@Service
public class MyService{
@Autowired
private MyRepository repository;
@Transactional(propagation=Propagation.SUPPORTS)
public Contact get(long id){
// better throw a notFuondException in here
return repository.findOne(id);
}
//same for other method like create and update with @Transactional REQUIRED NEW or REQUIRED propagation
}