Как удалить только одну сторону двунаправленного сопоставления @OneToOne в спящем режиме

У меня есть два столбца в двух отдельных объектах

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.

установите родительский / дочерний объект на null перед вызовом фактического метода удаления из репозитория.

Mr. Skip 03.12.2018 21:59

Сейчас попробую, спасибо. Это элегантный способ справиться с этим? Кажется беспорядочным, поскольку я чувствую, что спящий режим должен с этим справиться ...

Kyan 03.12.2018 22:00

@ Mr.Skip, это не сработало, я получаю org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null];. У меня обнуленные значения с обеих сторон.

Kyan 03.12.2018 22:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
1 175
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны использовать только 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.

Будем рассматривать переданную информацию, очень признателен.

Kyan 03.12.2018 23:07

Другие вопросы по теме