У меня есть приложение Spring Boot и в UserService
У меня есть транзакционный метод deleteUser(long id)
для удаления пользователей.
Мне также нужно удалить некоторые другие объекты (например, Cars
) перед удалением этого пользователя (объекты, прямо или косвенно созданные этим пользователем). Поэтому я публикую sh событие для удаления этих сущностей перед тем, как фактически удалить этого пользователя-создателя.
Мне нужно выполнить эти два процесса транзакционным образом, поэтому мой Event Listener
является транзакционным.
Проблема в том, что все Delete
вызовы, исходящие от слушателя, не будут удалять никакие сущности, и никакие исключения не будут возникать.
Вот мой код:
@Override
@Transactional
public void deleteUser(long id) {
User user = userRepository.findOne(id);
// Publish event before deleting this user
eventPublisher.publishEvent(new DeleteUserEvent(this, user));
userRepository.delete(id);
}
Me Event Listener:
@Component
public class UserDeletionListener {
@TransactionalEventListener
public void deleteUserEventListener(DeleteUserEvent deleteUserEvent) {
secondService.removeAllCreatedEntities(deleteUserEvent.getUser());
}
}
А вот класс removeAllCreatedEntities(User user)
in SecondService
:
public void removeAllCreatedEntities(User user){
carService.deleteCarsForUser(user);
}
И deleteCarsForUser(User user)
имеет простую реализацию удаления пружины jpa.
проблема в том, что автомобили вообще не удаляются, однако я знаю, что вложенные вызовы в транзакции будут рассматриваться как Transactional
.