2015-09-10 75 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

您可以尝试删除'getMeasurements()'@ OneToMany'注释中'mappedBy'属性以及'getPatient()'中的@ JoinColumn'吗? – Farrandu

+0

谢谢。我之前删除了JoinColumn,并没有任何效果。但删除JoinColumn以及mappedBy的伎俩。我现在可以删除测量。我开始相信,编写DataBase访问类和执行SQL查询有时更好,而不是使用ORM。休眠总是很酷,直到你遇到一些错误。比它更难调试,因为你不知道你的表和关系如何。至少如果你是像我这样的领域的新手。 – TardigradeX

相关问题