Привет, у меня довольно простые отношения. Пациент может иметь несколько измерений. Я использовал базу данных файлов 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>
ли кто-нибудь имеет намек, почему я не могу удалить измерение от пациента, а затем сохраняется его/ее?
Дело в том, что я не создал таблицы вручную. Hibernate создал таблицы на основе аннотаций. Возможно, мои аннотации неверны, но это то, что я пытаюсь выяснить. – TardigradeX
Можете ли вы попробовать удалить атрибут 'mappedBy' в аннотации' @ OneToMany' 'getMeasurements()', а также '@ JoinColumn' в' getPatient() '? – Farrandu
Спасибо. Я удалил JoinColumn раньше, и это не повлияло. Но удаление JoinColumn, а также mappedBy сделал трюк. Im теперь может удалить измерения. Я начинаю верить, что иногда лучше писать классы доступа DataBase и выполнять SQL-запросы вместо использования ORM. Hibernate всегда довольно круто, пока вы не получите некоторые ошибки. Чем сложно отлаживаться, потому что вы не знаете, как выглядят ваши таблицы и отношения. По крайней мере, если вы ноб в этой области, как я. – TardigradeX