У меня есть два столбца в двух отдельных объектах
Interview entity
@OneToOne(cascade=CascadeType.PERSIST, orphanRemoval = true)
@JoinColumn(name = "applicant_id", nullable=false)
private Applicant applicant_id;
Applicant entity
@OneToOne(mappedBy = "applicant_id", cascade = CascadeType.ALL, orphanRemoval = true)
private Interview interview_id;
Вопрос в том, как мне правильно сопоставить это, чтобы я мог запустить service.deleteInterview(); и удалить только запись объекта interview?
Если я использую cascadeType.all, это удаляет объект applicant. Я попытался изменить это, чтобы сохранить, тогда я получаю ошибку 500, говорящую, что объект будет воссоздан, если функция будет вызвана.
Добавление orphan removal=true закончилось этим исключением org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null];
Я думал о назначении mappedBy объекту interview, однако я не уверен, будет ли это решением, а также у меня есть оговорки, поскольку мой объект interview создается после создания объекта applicant.
Сейчас попробую, спасибо. Это элегантный способ справиться с этим? Кажется беспорядочным, поскольку я чувствую, что спящий режим должен с этим справиться ...
@ Mr.Skip, это не сработало, я получаю org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null];. У меня обнуленные значения с обеих сторон.




Вы должны использовать только cascade = ... и orphanRemoval = ... в сущности родитель (в вашем случае Applicant). Использование каскадов с обеих сторон ассоциаций не имеет смысла (для любых отношений, а не только один-к-одному). Подумайте, что делает каскадирование и что происходит, когда вы пытаетесь создать новый Interview. CascadeType.PERSIST говорит, что объекту Interview необходимо создать Applicant, если объекту интервью было задано поле соискателя. После того, как кандидат создан, он видит, что объект-кандидат имеет CascadeType.ALL, что означает, что ему необходимо сохранить любое поле Interview, которое у него есть, поэтому он снова попытается создать Interview, что не имеет смысла, поскольку вы уже создали интервью.
Я предполагаю, почему он удаляет Applicant, потому что у вас есть orphanRemoval с обеих сторон. Hibernate смотрит на Interview и думает, что, поскольку у него есть orphanRemoval, он является родительской стороной ассоциации, поэтому после удаления Interview он думает, что Applicant больше не нужен, и, следовательно, удаляет и эту запись.
В документах Hibernate указано, что здесь:
... Only the parent side of an association makes sense to cascade its entity state transitions to children.
Просмотрите некоторые примеры в этом руководстве, чтобы увидеть, как они используют каскадирование в отношениях OneToOne.
Будем рассматривать переданную информацию, очень признателен.
установите родительский / дочерний объект на
nullперед вызовом фактического метода удаления из репозитория.