Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 删除父实体抛出org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException:引用完整性约束冲突_Java_Hibernate_Jpa_Foreign Keys - Fatal编程技术网

Java 删除父实体抛出org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException:引用完整性约束冲突

Java 删除父实体抛出org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException:引用完整性约束冲突,java,hibernate,jpa,foreign-keys,Java,Hibernate,Jpa,Foreign Keys,所以我有两个表:projectStatus和projectStatusHistory。 创建新项目时,将在projectStatus表中插入一条新记录。项目启动或状态更改后,将在projectStatusHistory表中插入一条记录(该记录的内容来自projectStatus表),然后在projectStatus表中更新项目状态。当一个项目完成时,我们将把最后一条记录归档到历史记录表中,projectStatus表将不再有该项目的记录 但是projectStatusRepository.del

所以我有两个表:projectStatus和projectStatusHistory。
创建新项目时,将在projectStatus表中插入一条新记录。项目启动或状态更改后,将在projectStatusHistory表中插入一条记录(该记录的内容来自projectStatus表),然后在projectStatus表中更新项目状态。当一个项目完成时,我们将把最后一条记录归档到历史记录表中,projectStatus表将不再有该项目的记录

但是
projectStatusRepository.delete(projectStatusId)
会引发异常

原因:org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException:引用完整性约束冲突:“FKIB57NUSJBIJ4K8G83MFNY6V06


您无法删除
ProjectStatus
实体,因为它具有与子实体建立的外键
ProjectStatusHistory
。因此,该约束不允许您删除父实体,因为它会使子实体成为孤儿。具有相同属性序列的两个关系可能是需要解决的建模问题gin with.@code\u这在DB2中工作,但在H2中不工作。我从未使用过DB2,所以不确定,您是否在那里自己创建了db?并且可能错过了外键约束,可能是。不,我没有创建DB2表,
@Entity
@Table(name = "projectStatus", schema = "test")
public class ProjectStatus {
    @EmbeddedId
    private ProjectStatusId id;
    
    @Column(name = "projectName", nullable = false)
    private String projectName;
    
    @Column(name = "createDate", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date createDate;
    
    @Column(name = "status", nullable = false)
    private String status;

    @Column(name = "statusUpdateDate", nullable = false)
    private Date statusUpdateDate;  

    @OneToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.EAGER, mappedBy = "projectStatus")
    private List<projectStatusHistory> history;
}
@Embeddable
public class ProjectStatusId implements Serializable {
    @Column(name = "projectName", nullable = false)
    private String projectName;
    
    @Column(name = "createDate", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date createDate;
}
@Entity
@Table(name = "projectStatusHistory", schema = "test")
public class ProjectStatusHistory {

    @EmbeddedId
    private ProjectStatusHistoryId id;
    
    @Column(name = "projectName", nullable = false)
    private String projectName;
    
    @Column(name = "createDate", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date createDate;
    
    @Column(name = "status", nullable = false)
    private String status;

    @Column(name = "statusUpdateTimeStamp", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date statusUpdateTimeStamp;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({@JoinColumn(name = "projectName", insertable = false, updatable = false),
            @JoinColumn(name = "createDate", insertable = false, updatable = false)})
    private ProjectStatus projectStatus;

}
@Embeddable
public class ProjectStatusHistoryId implements Serializable {

    @Column(name = "projectName", nullable = false)
    private String projectName;
    
    @Column(name = "createDate", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date createDate;

    @Column(name = "statusUpdateTimeStamp", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date statusUpdateTimeStamp;
}
public interface ProjectStatusRepository extends JpaRepository<ProjectStatus, ProjectStatusId> {
}
public interface ProjectStatusHistoryRepository extends JpaRepository<ProjectStatusHistory, ProjectStatusHistoryId> {
}
public void projectStatusChanged(ProjectStatusId projectStatusId){
    ProjectStatus projectStatus =  projectStatusRepository.findById(projectStatusId);
    //move current status to history table and then update status 
    projectStatusHistory = createANewProjectStatusHistoryFromProjectStatus(projectStatus);
    projectStatus.status = newStatus;
    projectStatus.History = projectStatusHistory;
    projectStatusRepository.save(projectStatus);
}

public void projectComplete(ProjectStatusId projectStatusId){
    ProjectStatus projectStatus =  projectStatusRepository.findById(projectStatusId);
    //move current status to history table and then update status 
    projectStatusHistory = createANewProjectStatusHistoryFromProjectStatus(projectStatus);
    projectStatusHistoryRepository.save(projectStatusHistory);
    projectStatusRepository.delete(projectStatusId);
}