Лучшая практика: Spring Boot Backend & jQuery Frontend - PullRequest
0 голосов
/ 30 августа 2018

В настоящее время я работаю над проектом с Spring Boot 2 Backend и jQuery Frontend. Таким образом, внешний интерфейс отправляет Ajax-запрос контроллерам REST для работы с объектами базы данных.

Когда речь идет о создании сущностей с внешними связанными сущностями с помощью этих вызовов ajax (например, создание человека с несколькими адресами), я спрашиваю себя, каков будет наилучший опыт, учитывая транзакционные операции и сокращение избыточного кода.

Я уже думал об этих возможностях:

  1. Несколько вызовов ajax Создание связанных сущностей с одним вызовом ajax для каждой сущности и проверка, не произошли ли они. Если произойдет сбой, удалите все созданные объекты с помощью вызовов ajax для каждого, например, откат вручную. Похоже, очень плохая концепция.

  2. Один Ajax-вызов, отправляющий все параметры Один Ajax-вызов отправляет все необходимые параметры для сущностей, которые должны быть созданы. Затем создание всех сущностей через сервер служб сущностей на стороне. Но как действовать транзакционно здесь? А как уменьшить избыточный код?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Во-первых, мне нужно знать, какую базу данных вы используете. Если вы используете 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();
  }
}
0 голосов
/ 30 августа 2018

Вы правы, чтобы рассмотреть транзакционность. Как вы уже указали, вариант 1 является плохим подходом, так как требует ручного отката. Вариант 2 кажется наиболее законным, но он требует, чтобы ваш сервер обрабатывал откат. Что должно быть достаточно просто, если правильно настроен TransactionManager.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...