2014-02-10 1 views
0

У меня есть OneToMany отношения следующим образом:«ConstraintViolationException: Невозможно удалить или обновить родительскую строку» выброшены с @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 аннотации необходимо добиться того, что я сделал вручную ...
+0

Проверить аналогичный вопрос был дан ответ здесь: [Невозможно удалить или обновить родительскую строку ConstraintViolationException] (http://stackoverflow.com/questions/40641181/cannot-delete-or-update-a-parent- row-constraintviolationexception/40645955 # 40645955) –

ответ

-1

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

@Entity 
public class Curriculum { 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval=true) 
    private Set<WorkExperience> workExperiences; 
     ... 
+0

Я пробовал, как вы посоветовали. Это на самом деле не работает ... Пожалуйста, не то, что предполагается удалить строку в таблицах 'work_experience' и' curriculum_work_experiences'. – balteo