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将返回联系人的
持久
实例,这意味着对该实例所做的每个更改都将应用于数据库。如果实例
已分离