Java Hibernate/H2@OneToMany“;引用完整性约束冲突“;关于孩子的离开?

Java Hibernate/H2@OneToMany“;引用完整性约束冲突“;关于孩子的离开?,java,hibernate,one-to-many,h2,referential-integrity,Java,Hibernate,One To Many,H2,Referential Integrity,你好,我的关系很简单。 一名患者可以进行多个测量。我使用了H2文件数据库和Hibernate 问题是: 当我试图从患者身上移除测量值时,我得到了一个错误提示 Referential integrity constraint violation: "FK_O423U89KR6K78NNG1PO0ISDF6: PUBLIC.PATIENTVO_MEASUREMENTVO FOREIGN KEY(MEASUREMENTS_ID) REFERENCES PUBLIC.MEASUREMENTVO(ID)

你好,我的关系很简单。 一名患者可以进行多个测量。我使用了H2文件数据库和Hibernate

问题是: 当我试图从患者身上移除测量值时,我得到了一个错误提示

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;
        }
    }
持久性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>

org.hibernate.jpa.HibernatePersistenceProvider
ch.fhnw.ima.doggait.vo.PatientVO
ch.fhnw.ima.DOGGATE.vo.MeasurementVO
ch.fhnw.ima.doggait.vo.MeasurementTributesVO
ch.fhnw.ima.doggait.vo.TimeMark

是否有人提示我为什么不能从患者身上删除度量值,然后将其持久化?

从违反约束的表名(
PATIENTVO\u measurementtvo
)中,似乎您有一个中间表来实现该关系。这通常用于多对多关系中


作为一对多的关系,为什么不从测量中向患者添加外键?

问题是,我没有手动创建表。Hibernate根据注释创建了表。也许我的注释不正确,但这正是我想找出的。你能尝试删除
@OneToMany
注释
getMeasurements()
中的
@JoinColumn
属性以及
getPatient()
中的
@JoinColumn
吗?谢谢。我之前删除了JoinColumn,但它没有任何效果。但移除JoinColumn和mappedBy成功了。我现在可以删除测量值了。我开始相信有时编写数据库访问类和执行SQL查询比使用ORM更好。在出现一些错误之前,Hibernate总是很酷的。因为你不知道你的表和关系到底是什么样子的,所以调试起来就很难了。至少如果你像我一样是这个领域的高手。