Как удалить родителя, не удаляя детей в отношениях один ко многим - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь удалить сущность 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 Ответ

0 голосов
/ 24 июня 2018

Вам необходимо разрешить значения 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);
}
...