2015-09-10 1 views
0

Привет, у меня довольно простые отношения. Пациент может иметь несколько измерений. Я использовал базу данных файлов H2 и Hibernate.Hibernate/H2 @OneToMany «Нарушение ограничения ссылочной целостности» при удалении ребенка?

Проблема: Когда я пытаюсь удалить измерение у пациента, я получаю следующую ошибку.

Referential integrity constraint violation: "FK_O423U89KR6K78NNG1PO0ISDF6: PUBLIC.PATIENTVO_MEASUREMENTVO FOREIGN KEY(MEASUREMENTS_ID) REFERENCES PUBLIC.MEASUREMENTVO(ID) (X'3c2b9ee868f645c5a5a743c2a409ab5e')"; SQL statement: 
delete from MeasurementVO where id=? [23503-185] 

Пациент часть отношений:

@OneToMany(orphanRemoval=true, cascade={CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE}, mappedBy = "patient", fetch = FetchType.EAGER) 
public List<MeasurementVO> getMeasurements() { 
    return measurements; 
} 

Измерение части отношений:

@ManyToOne 
@JoinColumn 
public PatientVO getPatient() { 
    return patient.get(); 
} 

Функции, которая должна удалить измерение:

@Override 
@Transactional 
public boolean removeMeasurementFromPatient(PatientVO patientVO, MeasurementVO measurementVO) { 
     EntityManager manager = emProvider.get(); 
     PatientVO patientAlreadyInDB = manager.find(PatientVO.class, patientVO.getPatientId()); 

     if (patientAlreadyInDB != null) { 
      patientAlreadyInDB.getMeasurements().removeIf(measurement -> measurement.getId().equals(measurementVO.getId())); 
      manager.merge(patientAlreadyInDB); 
      return true; 
     } else { 
      return false; 
     } 
    } 

И упорство ENCE XML:

<?xml version="1.0" encoding="UTF-8" ?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> 

    <persistence-unit name="db" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 

     <class>ch.fhnw.ima.doggait.vo.PatientVO</class> 
     <class>ch.fhnw.ima.doggait.vo.MeasurementVO</class> 
     <class>ch.fhnw.ima.doggait.vo.MeasurementAttributesVO</class> 
     <class>ch.fhnw.ima.doggait.vo.TimeMark</class> 

     <properties> 
      <property name="connection.driver_class" value="org.h2.Driver"/> 
      <!-- <property name="hibernate.connection.url" value="jdbc:h2:mem:db"/>--> 
      <property name="hibernate.connection.url" value="jdbc:h2:file:./database/dogdatabase"/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> 
      <!--<property name="hibernate.hbm2ddl.auto" value="create-drop"/>--> 
      <property name="hibernate.hbm2ddl.auto" value="update"/> 
      <property name="hibernate.show_sql" value="true"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

ли кто-нибудь имеет намек, почему я не могу удалить измерение от пациента, а затем сохраняется его/ее?

ответ

2

Из названия таблицы, ограничение которой нарушено (PATIENTVO_MEASUREMENTVO), похоже, что у вас есть промежуточная таблица для реализации отношения. Обычно это используется во многих отношениях.

Будучи отношениями от одного до многих, почему бы не просто добавить внешний ключ от измерения к пациенту?

+0

Дело в том, что я не создал таблицы вручную. Hibernate создал таблицы на основе аннотаций. Возможно, мои аннотации неверны, но это то, что я пытаюсь выяснить. – TardigradeX

+0

Можете ли вы попробовать удалить атрибут 'mappedBy' в аннотации' @ OneToMany' 'getMeasurements()', а также '@ JoinColumn' в' getPatient() '? – Farrandu

+0

Спасибо. Я удалил JoinColumn раньше, и это не повлияло. Но удаление JoinColumn, а также mappedBy сделал трюк. Im теперь может удалить измерения. Я начинаю верить, что иногда лучше писать классы доступа DataBase и выполнять SQL-запросы вместо использования ORM. Hibernate всегда довольно круто, пока вы не получите некоторые ошибки. Чем сложно отлаживаться, потому что вы не знаете, как выглядят ваши таблицы и отношения. По крайней мере, если вы ноб в этой области, как я. – TardigradeX