ConstraintViolationException: невозможно удалить или обновить родительскую строку, созданную с отношением @OneToMany

У меня есть отношение OneToMany следующим образом:

@Entity
public class Curriculum {

    @OneToMany(cascade = CascadeType.ALL)
    private Set<WorkExperience> workExperiences;
        ...

Вот сущность WorkExperience:

@Entity
public class WorkExperience {
...

Когда я пытаюсь удалить WorkExperience следующим образом:

@Override
public void deleteWorkExperience(long workExperienceId) {
  workExperienceRepository.delete(workExperienceId);
}

Я получаю следующее исключение:

 org.hibernate.exception.ConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`bignibou`.`curriculum_work_experiences`, CONSTRAINT `FKFA6D4B9F8B68AA0C` FOREIGN KEY (`work_experiences`) REFERENCES `work_experience` (`id`))

Мои вопросы заключаются в следующем:

  1. Если я хочу сохранить таблицу соединений, то есть curriculum_work_experiences, как правильно удалить WorkExperience?
  2. Я заметил, что вручную установив для fk значение on cascade delete в MySql, он работал правильно, но я не уверен, какая аннотация JPA необходима для достижения того, что я сделал вручную...

person balteo    schedule 10.02.2014    source источник
comment
Проверьте, что здесь был дан ответ на аналогичный вопрос: Невозможно удалить или обновить родительская строка ConstraintViolationException   -  person Shubham Vadhera    schedule 17.11.2016


Ответы (1)


Удаление сирот - это путь в этом сценарии. Вы не можете удалить его напрямую, используя workExperienceId, потому что это однонаправленная связь таблицы соединения, а база данных ограничена ссылочной целостностью внешнего ключа, вам придется удалить ее с помощью объекта Curriculum, вам нужно получить ссылку на Set workExperiences и удалите его из этого набора, но сначала обязательно добавьте элемент orpanRemoval=true в аннотацию @OneToMany, как показано ниже, этот атрибут также принудительно удаляет все ссылки в таблице соединений.

@Entity
public class Curriculum {

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval=true)
    private Set<WorkExperience> workExperiences;
        ...
person Sparticles    schedule 10.02.2014
comment
Я попробовал, как вы посоветовали. На самом деле это не работает... Обратите внимание, что предполагается удаление строки как в таблицах work_experience, так и в таблицах curriculum_work_experiences. - person balteo; 10.02.2014