Hibernate 对象在数据库中自动更新
我正在使用Hibernate 对象在数据库中自动更新,hibernate,spring-data,Hibernate,Spring Data,我正在使用Spring数据jpa和Spring mvc,我注意到我的对象contact在数据库中自动更新 这是我的密码: @Transactional @Controller public class ContactController { @RequestMapping(value="/update_contact ") public @ResponseBody String update_contact (...) { ... Con
Spring数据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)代码>我的联系人
在我检查数据库时已更改
你能给我解释一下原因吗?有很多物体:
- 持久性:持久性实例在数据库中具有表示形式和标识符值,并且与Hibernate会话关联李>
- 分离的:分离的实例是一个已持久化但其会话已关闭的对象
- 暂时的:如果一个对象刚刚使用新操作符实例化,并且没有与Hibernate会话关联,那么它就是暂时的李>
在此上下文中,更改提交给contact,因为它是一个在事务中被修改的持久对象,因为您的控制器用@Transactional
注释,所以它与Hibernate会话关联
使用Transactional
注释对控制器
进行注释不是一个好的做法,它最好在服务层使用,我们在服务层调用存储库
,而不是在控制器层
@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
}
是的,我知道他们说最好将事务性
放在服务层上,但这不是义务。所以,即使我会像你说的那样创建一个服务层,我也会有同样的行为->对象将自动更新。我说这不是一个好的做法,你可能会面临脏读和大量数据库连接溢出的风险,这意味着每次客户端加载页面时,都会对数据库进行更改!!它的MVC,它应该是轻量级的,独立于持久层,它应该是持久层的客户端,这意味着服务。感谢您提供的信息,所以您的意思是即使我没有制作类似于contactrespository.findOne(idcontact)的东西
在我的控制器中,将打开与数据库的连接?但您的回答没有解释我的问题。。。您的回答只是一个建议,因为即使我放置了一个服务层,我的问题仍然存在。findOne将返回联系人的持久
实例,这意味着对该实例所做的每个更改都将应用于数据库。如果实例已分离