Как удалить только одну сторону двунаправленного отображения @OneToOne в спящем режиме - PullRequest
0 голосов
/ 03 декабря 2018

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

Объект интервью

@OneToOne(cascade=CascadeType.PERSIST, orphanRemoval = true)
@JoinColumn(name = "applicant_id", nullable=false)
private Applicant applicant_id;

Заявитель

@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];

Iя думал о присвоении mappedBy сущности interview, однако я не уверен, что это будет решением, а также у меня есть резервирования, поскольку моя сущность interview создается после создания сущности applicant.

1 Ответ

0 голосов
/ 04 декабря 2018

Вы должны использовать cascade = ... и orphanRemoval = ... только для родительского объекта (в вашем случае Applicant).Использование каскадов на обеих сторонах ассоциаций не имеет смысла (для любых отношений, а не только один к одному).Подумайте, что делает каскадирование, и что происходит, когда вы пытаетесь создать новый Interview.CascadeType.PERSIST говорит, что объекту Interview необходимо создать Applicant, если объекту интервью было задано поле кандидата.Как только заявитель создан, он видит, что сущность заявителя имеет CascadeType.ALL, что означает, что ему нужно сохранить любое поле Interview, которое у него есть, поэтому он снова попытается создать Interview, что не имеет смыслапоскольку вы уже создали интервью.

Я думаю, почему оно удаляет Applicant, потому что у вас orphanRemoval с обеих сторон.Hibernate смотрит на Interview и думает, что, поскольку он имеет orphanRemoval, он является родительской стороной ассоциации, поэтому после удаления Interview он думает, что Applicant больше не нужен, и поэтому также удаляет эту запись.

Документы Hibernate заявляют как можно больше здесь :

... Только родительская сторона ассоциации имеет смысл каскадировать переходы ее состояния сущности в дочерние.

Просмотрите некоторые примеры в этом руководстве, чтобы увидеть, как они используют каскадирование в OneToOne отношениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...