微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决删除父实体抛出 org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: 参照完整性约束冲突

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

但是 projectStatusRepository.delete(projectStatusId) 抛出异常

引起:org.h2.jdbc.JdbcsqlIntegrityConstraintViolationException:违反参照完整性约束:“FKIB57NUSJBIJ4K8G83MFNY6V06 ...

@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)
    @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 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",updatable = false)})
    private ProjectStatus projectStatus;

}
@Embeddable
public class ProjectStatusHistoryId implements Serializable {

    @Column(name = "projectName",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);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。