【问题标题】:Best Practice: Spring Boot Backend & jQuery Frontend最佳实践:Spring Boot 后端和 jQuery 前端
【发布时间】:2019-02-05 08:44:58
【问题描述】:

我目前正在开发一个带有 Spring Boot 2 后端和 jQuery 前端的项目。因此前端向 Spring REST 控制器发送 Ajax 请求以操作数据库实体。

当谈到通过这些 ajax 调用创建具有外部链接实体的实体时(例如,创建一个具有多个地址的人),我问自己最佳实践是什么,同时考虑事务操作和减少冗余代码。

我已经考虑过这些可能性:

  1. 几个 ajax 调用 每个实体使用一个 ajax 调用创建链接实体,并检查它们是否失败。如果一个失败,删除所有创建的带有 ajax 调用的实体,就像手动回滚一样。似乎是一个非常糟糕的概念。

  2. 一个 Ajax 调用发送所有参数 让一个 ajax 调用为必须创建的实体发送所有必要的参数。然后通过实体服务服务器端创建所有实体。但是这里如何操作事务呢?以及如何减少冗余代码?

提前致谢

【问题讨论】:

  • 绝对不是第一个。您使用哪种 ORM?
  • 您可以拥有一个会话范围的控制器和事务并在最后提交所有内容,我认为这种方法没有问题。

标签: javascript java html json ajax


【解决方案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();
  }
}

【讨论】:

  • 如果所有信息都存储在单个文档中,那么事务和 MongoDB 就不会成为问题。如果您需要处理多个文档或多个集合,那么您是对的。
  • 你是对的。单个文档中的操作是原子的:)。谢谢!
【解决方案2】:

考虑事务性是对的。正如您已经指出的那样,选项 1 是一种不好的方法,因为它需要手动 rollbabck。选项 2 似乎是最合法的,但它需要您的后端来处理回滚。如果配置了适当的 TransactionManager,这应该很容易。

【讨论】:

  • 我会选择第三个选项,让您重新评估您的设计。为什么您只想创建一个完整的列表而不是单个列表。也许可以在更早的阶段找到交易边界。
猜你喜欢
  • 2021-06-19
  • 2023-03-18
  • 2021-09-07
  • 1970-01-01
  • 2013-03-13
  • 2010-09-24
  • 2021-04-01
  • 2020-03-08
  • 2023-04-10
相关资源
最近更新 更多