Удаление данных Spring JPA не работает при вызове из прослушивателя событий - PullRequest
0 голосов
/ 08 января 2020

У меня есть приложение 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.

...