Учитывая приведенный ниже код, почему это происходит, когда я вызываю PersonService.updateAccountMembership
с контроллера. Мне нужно указать аннотацию @Transactional
на запрос @Modifying
(AccountRepo.updateMembership
)? Не содержит аннотации @Transactional
на вызов службы, который вызывает требуемый модифицирующий запрос (AccountService.updateMembership
)?Почему для изменения запроса JPA требуется аннотация @Transactional?
ниже код сломается, если я удалить @Transactional
аннотацию на модифицирующего запроса со следующим исключением:
javax.persistence.TransactionRequiredException: Executing an update/delete query
Услуги:
@Service
public class PersonService{
@Autowired
PersonRepo personRepo;
@Autowired
AccountService accountService;
public Person updateAccountMembership(Person person, int membership){
person = this.save(person);
accountService.updateMembership(person, membership);
}
@Transactional
public Person save(Person person){
return personRepo.save(person);
}
}
учетной записи службы:
@Service
public class AccountService {
@Autowired
AccountRepo accountRepo;
@Transactional
public void updateMembership(Person person, int membership){
accountRepo.updateMembership(person, membership);
}
}
Репутация счета:
public class AccountRepo extends JpaRepository<Account,Integer> {
@Transactional //WHY IS THIS REQUIRED????????
@Modifying
@Query("update .........")
void updateMembership(@Param("person") Person person, @Param("memb") int membership);
}
Это не должно быть необходимым, однако убедитесь, что транзакции для 'AccountService' фактически применяются. Также вызов 'this.save' не является транзакционным, поскольку он никогда не проходит через прокси-сервер, который применяет транзакцию. –