Как сказал Цзянь, это не вызов changeMenuNotificationReadStatus, который вызывает ошибку, а, вероятно, предыдущий оператор, который не был сброшен.
Что-то генерирует этот оператор удаления, который отвечает за нарушение ограничения FK:
delete from t_menu_alert where id=?
В ваших тестах вы могли бы регулярно использовать saveAndFlush
вместо save
и flush
методы для выдачи запросов на изменение SQL и посмотреть, в чем заключается проблема.
Здесь,JPA пытается удалить MenuAlert
перед удалением ссылки MenuAlertNotification
, поэтому ограничение FK блокируется, как вы, вероятно, знаете.
Поскольку уведомление для удаленного предупреждения не имеет смысла, вы также можете каскадировать удаление:
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
или измените действие ограничения FK ON DELETE
на уровне базы данных: CASCADE удалит ссылки MenuAlertNotification
s, а SET NULL очистит связь, установив значение null при обращении к MenuAlertNotification.menuAlert
.
Вы также можете написать Java-код для удаления MenuAlertNotification
с до MenuAlert
, в зависимости от условий.
Я будуЯ хочу прочитать весь ваш тестовый код.
Адил Халил, вы правы, что если метод Spring Data JPA Repository.save используется напрямую, нам нужно получить возвращаемое значение, чтобы иметь обновленный идентификатор.Но здесь, я думаю, он вызывает сервисный уровень, который должен вернуть обновленное значение:
@Service
public class MenuAlertNotificationService {
private MenuAlertNotificationRepository repository;
public MenuAlertNotification save(MenuAlertNotification entity) {
return repository.save(entity);
}
}