Как удалить родителя, не удаляя детей в отношениях один ко многим

Я пытаюсь удалить объект 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);
}
Другие вопросы по тегам