Удалить из однонаправленных связей «многие ко многим», где Cascade.Remove не вариант - PullRequest
1 голос
/ 23 февраля 2020

У меня есть две сущности, чтобы упростить, сказали Департамент и Сотрудник, Департамент и Сотрудник имеют однонаправленное отношение «многие ко многим», где Департамент имеет свойство employees, но Сотрудник не может перейти к отделам.

Затем, чтобы удалить Сотрудника, я вызываю deleteById(employeeId) или delete(employee) из EmployeeRepository (который расширяет CrudRepository из Spring Data JPA)

Этот вызов вызовет JdbcSQLIntegrityConstraintViolationException , поскольку он не удаляет сначала ассоциацию в таблице присоединения Department_Employee . Увольнение Сотрудника должно сопровождаться удалением во всех его ассоциациях с его отделами.

Что является хорошим способом для достижения этой цели?

У меня возникла одна идея:

Используйте @Modifying с @Query, чтобы переопределить метод delete из CrudRepository.

Но Spring Data JPA, похоже, не поддерживает последовательный запуск нескольких запросов в аннотации @Query, я не знаю, как сначала удалить все ассоциации, а затем удалить сотрудника в одном запросе JPQL.

Пожалуйста, поделитесь своими идеями или практиками, большое спасибо!

1 Ответ

0 голосов
/ 24 февраля 2020

С такой проблемой я нахожу полезным думать с точки зрения доменного дизайна, который является основой репозиториев Spring Data.

С DDD Department и Employee будут разными агрегатами и поэтому имеют два отдельных хранилища. Если вы хотите удалить оба, все ссылки на сотрудника и самого сотрудника, это влияет на оба репозитория и поэтому должно обрабатываться двумя отдельными методами, которые затем вызываются из одного сервиса.

Я также хотел бы не используйте JPA здесь, так как удаление всех ссылок является одним оператором SQL, в то время как для этого потребуется загрузить потенциально много экземпляров Department, просто чтобы удалить ссылку и сохранить их снова.

...