Hibernate: удаление родительской сущности вызывает запрос на обновление дочерних элементов - PullRequest
0 голосов
/ 28 марта 2019

Ситуация

У меня есть пара родитель-потомок сущностей JPA.Родитель называется JobTemplate и ссылается на дочерний элемент как:

@OneToMany(cascade = {CascadeType.MERGE,CascadeType.PERSIST}, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "job_template_id")
private List<ChecklistTemplateEntry> checklistEntries = new ArrayList<>();

Дочерний элемент называется ChecklistTemplateEntry и ссылается на своего родителя следующим образом:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "job_template_id")
private JobTemplate jobTemplate;

На сервере MySQL естькаскадная установка.Команда создания дочерней таблицы гласит:

 FOREIGN KEY (job_template_id) REFERENCES job_template(id) ON DELETE CASCADE 

Каскадирование работает нормально, если я удаляю сущность, вручную вводя команды sql.

Проблема

Когда я пытаюсь удалить родительский объект через JPA (весенний загрузочный репозиторий), вызывая

jobTemplateRepo.delete(jobTemplateToDelete); //from CrudRepository

JPA запускает запрос на обновление дочерней таблицы:

update checklist_template_entry set job_template_id=null where job_template_id=?

ThisMySQL не принимает запрос, так как у job_template_id есть правило NOT NULL (по уважительной причине).В результате я не могу удалить свою сущность.Я получаю:

java.sql.SQLException: Column 'job_template_id' cannot be null

Цель

Я хочу использовать каскадный JPA от родителя к потомку при операциях создания / обновления.Но при удалении родительской сущности я хочу, чтобы JPA только инициировал запрос на удаление этой сущности и не пытался обновить дочерние объекты, так как это вызывает проблемы, и MySQL все равно позаботится об этом.

ЧтоЯ пробовал

  • Различные комбинации каскадирования, включая ВСЕ, все, кроме удаления и т. Д.
  • Включение / отключение отложенной загрузки с обеих сторон.

1 Ответ

1 голос
/ 28 марта 2019

Вы пропускаете аргумент «mappedBy» на одной стороне двунаправленной аннотации, фактически создавая два однонаправленных отношения. Замените JoinColumn с одной стороны аргументом mappedBy, и вы должны получить правильные операторы удаления.

...