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