Как удалить родителя, не удаляя детей в отношениях один ко многим
Я пытаюсь удалить объект Patient, не удаляя связанные объекты OutboundMessage, так как я хочу сохранить их в базе данных для отчетов / исторических целей. Это соответствующий код:
Терпеливое лицо
@OneToMany (mappedBy="patient", fetch = FetchType.EAGER,orphanRemoval = false)
public Set<OutboundMessage> getOutboundMessages()
{
return outboundMessages;
}
Сущность OutboundMessage
@ManyToOne (fetch=FetchType.EAGER)
@JoinColumn(name = "id_patient")
public Patient getPatient()
{
return patient;
}
Когда я устанавливаю каскадный тип на стороне пациента, записи удаляются, а это не то, что я хочу. При попытке, как показано в коде выше (без каскадного типа), я получаю следующее исключение:
The DELETE statement conflicted with the REFERENCE constraint "FKqjpga9w6wp3qk26ox9pg252d9". The conflict occurred in database "MDHIS", table "dbo.tblOutboundMessage", column 'id_patient'.
Какие настройки необходимы владельцу, чтобы разрешить удаление без каскадирования дочерних объектов и без очистки потерянных записей?
Спасибо!
1 ответ
Вы должны разрешить null
значения в столбце внешнего ключа (@JoinColumn
) следующее:
@ManyToOne (fetch=FetchType.EAGER)
@JoinColumn(name = "id_patient", nullable = true)
public Patient getPatient() {
return patient;
}
Тогда в вашем DAO вам нужно установить null
значения для всех OutboundMessage
связанный с Patient
Вы собираетесь удалить и только затем удалить его, как показано ниже:
public void deletePatient(int patientId) {
Session currentSession = sessionFactory.getCurrentSession();
// get patient with primary key
Patient patient = currentSession.get(Patient.class, patientId);
Set<OutboundMessage> messages = patient.getOutboundMessages();
//set patient id null
for(OutboundMessage message : messages) {
message.setPatient(null);
}
//delete the patient
currentSession.remove(patient);
}