Я использую spring boot и hibernate через jpa. Я использую интерфейс JpaRepository для реализации своих репозиториев. Как со следующим UserRepository
public interface UserRepository extends JpaRepository<User, Long> {
}
Я хочу добиться следующих
- Загрузите пользовательский объект.
- Измените состояние объекта объекта, например. user.setName( "Foo" )
- Выполняет вызов внешней системы webservice. Сохранить результат вызова в DB
- Только при успешном ответе этого вызова webservice сохраните новое состояние пользователя в репозитории.
Все вышеописанные шаги не выполняются в одной транзакции, то есть внешний вызов службы не выполняется.
Когда я сохраняю результат работы webservice в базе данных через свой репозиторий, мои изменения в объекте пользователя также сохраняются. Согласно моему пониманию, это связано с потерей подстилающего контекста персистентности на шаге 3. После некоторых google, я думаю, что могу достичь своей цели, если я могу отделить свою пользовательскую сущность на первом шаге и снова подключить ее на шаге 4. Пожалуйста, подтвердите, правильно ли я понимаю и как я могу это достичь? В интерфейсе JpaRepository не существует способа отсоединить объект.
Ниже приведен код, иллюстрирующий
public void updateUser(int id, String name, int changeReqId){
User mUser = userRepository.findOne(id); //1
mUser.setName(name); //2
ChangeRequest cr = changeRequestRepository.findOne(changeReqId);
ChangeResponse rs = userWebService.updateDetails(mUser); //3
if(rs.isAccepted()){
userRepository.saveAndFlush(mUser); //4
}
cr.setResponseCode(rs.getCode());
changeRequestRepository.saveAndFlush(cr); //this call also saves the changes at step 2
}
Спасибо