Java 防止Spring提交控制器中所做的实体更改

Java 防止Spring提交控制器中所做的实体更改,java,spring,hibernate,spring-mvc,spring-data-jpa,Java,Spring,Hibernate,Spring Mvc,Spring Data Jpa,我正在使用下面的代码段从服务层加载一个实体进行编辑 public class VendorServiceImpl{ @Transactional(readOnly=true) Vendor findVendor(...){ return vendorRepository.findVendorBy(...); } } @Controller VendorController{ @AutoWired VendorService vendorServ

我正在使用下面的代码段从服务层加载一个实体进行编辑

public class VendorServiceImpl{

@Transactional(readOnly=true)
Vendor findVendor(...){
return vendorRepository.findVendorBy(...);
}

}

    @Controller
    VendorController{

       @AutoWired
       VendorService vendorService;

       @GetMapping("/edit/{id}")
       public String editVendor(@PathVariable("id")Long id){
         Vendor v =   vendorService.findVendorBy(id);
         /*
          After loading the entity from db I want to make a few changes
          e.g 
          v.setCountry("xyz");
         This change is automatically sent to the database which I don't       want.
         /*
       }
}
我怎样才能防止这个问题。我想在用户提交表单后提交更改


我使用的是spring 4.3.7和hibernate 5.0.12

是否设置了国家/地区进行数据库调用,如果是这样,那么理想情况下,DB调用不应从实体进行,而应从服务层进行,因为从实体层进行处理会有问题。但是,如果您无法更改此设置,那么我建议您围绕控制器创建一个事务。这应该确保在控制器中的事务完成后,才提交值


另外,作为一种实践,请确保连接的autocommitted属性设置为false

setCounty是供应商类中的setter。它不是在进行数据库调用。那么setCountry(“xyz”)如何进入数据库…数据库调用在哪里进行?您是否启用了事务管理?进行更改应该在您的服务或控制器中进行,这是属于服务层的业务逻辑。您的控制器应该只是从外部通信到内部服务调用的薄型转换层。如果您更改数据是因为您想隐藏数据以防暴露,则需要DTO或封送处理框架的正确配置。@M.Deinum是的,但OP不需要在服务层更改数据,如果您这样做,对象将同步。。。OP对无法同步的地方感到好奇。因此,有时会出现配置问题。是的,如果OP需要更新值,它应该在服务层/业务中完成,而不是在控制器中。他首先不应该在控制器中更改内容,尤其是在GET请求中,尤其是在使用托管实体时。那是两倍的禁区。。。但是,只有在没有或错误的事务管理与查看[Filter | Interceptor]中打开的[EntityManager | Session]相结合的情况下,才会出现这种情况。我在web.xml中混淆了OpenEntityManagerViewFilter,如下所示:SpringOpenEntityManagerViewFilter org.springframework.orm.jpa.support.OpenEntityManagerViewFilter persistenceUnitName MedEquipmu SpringOpenEntityManagerViewFilter/*