我目前正在使用Spring Boot 2后端和jQuery前端进行项目。因此,前端将Ajax请求发送到spring REST控制器以与数据库实体一起操作。
当通过那些ajax调用来创建具有外部链接的实体的实体时(例如,创建具有多个地址的人),我问自己,在考虑事务操作并减少冗余代码的同时,最佳做法是什么。
我已经考虑过这些可能性:
多个ajax调用 通过每个实体一个ajax调用创建链接的实体,并检查它们是否失败。如果失败,则删除所有创建的具有ajax调用的实体,例如手动回滚。似乎是一个非常糟糕的概念。
一个Ajax调用发送所有参数 进行一次ajax调用,为要创建的实体发送所有必需的参数。然后通过实体服务服务器端创建所有实体。但是如何在这里进行事务性操作?以及如何减少冗余代码?
预先感谢
答案 0 :(得分:1)
首先,我需要知道您正在使用哪个数据库。如果您使用的是MongoDB,请忽略事务部分(除非您使用的是4.0版本和事务支持)。因此,我想您选择一个SQL数据库。
您问题的答案可能取决于前端如何处理数据。 对我来说,第一种选择无论如何都没有意义。 似乎您要么想包含所有地址,要么根本不包含任何地址,所以我将对所有地址进行一次请求,因为整个数据被视为不可分割的集合。
使用Hibernate和事务管理器可以轻松解决事务部分(只需注释将地址另存为@Transactional的方法即可)
我会这样实现:
控制器:
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/{userId}/address")
public List<Address> addAddress(@PathVariable String userId,
@RequestBody AddressInsertRequest request){
return userService.updateAddresses(userId, request.getAddresses());
}
//Externalize to oter class
public class AddressInsertRequest {
private List<Address> addresses;
public List<Address> getAddresses() {
return addresses;
}
public void setAddresses(List<Address> addresses) {
this.addresses = addresses;
}
}
}
服务:
public class UserService {
//TODO Implement with hibernate
private UserRepository userRepository;
@Transactional
public List<Address> updateAddresses(String userId, List<Address> addressList){
User user = userRepository.findById(userId);
user.setAddressList(addressList);
userRepository.save(user);
return user.getAddressList();
}
}
答案 1 :(得分:0)
您正确考虑事务性。正如您已经指出的那样,选项1是一种不好的方法,因为它需要手动执行rollbabck。选项2似乎是最合法的选择,但它需要您的后端来处理回滚。如果配置了正确的TransactionManager,这应该很容易。