Ситуация
У меня есть пара родитель-потомок сущностей 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 все равно позаботится об этом.
ЧтоЯ пробовал
- Различные комбинации каскадирования, включая ВСЕ, все, кроме удаления и т. Д.
- Включение / отключение отложенной загрузки с обеих сторон.