我有 4 个实体:
Profile与companyContract有关系:
@OneToMany(fetch = FetchType.EAGER, mappedBy = "profile", cascade = { CascadeType.ALL })
@Fetch(value = FetchMode.SUBSELECT)
@Cascade({ org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
private List<CompanyContract> companyContracts;
CompanyContract与工时单有关系:
@OneToMany(mappedBy = "companyContract", cascade = { CascadeType.ALL },orphanRemoval = true, fetch = FetchType.EAGER)
@Fetch(FetchMode.SUBSELECT)
@Cascade({ org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
private List<Timesheet> timesheets;
@ManyToOne
@JoinColumn(name = "IDPROFILE")
private Profile profile;
Timesheet 与发票有关系:
@OneToMany(mappedBy = "timesheet", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
@Cascade({ org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
private List<Invoice> invoices;
@ManyToOne
@JoinColumn(name = "IDCONTRACT")
private CompanyContract companyContract;
发票:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ID_TIMESHEET")
private Timesheet timesheet;
正如您在这里看到的,我正在使用 org.hibernate.annotations.CascadeType.DELETE_ORPHAN 以便我可以删除父项的子项。
如果我执行这个:
Profile p = companyContract.getProfile();
p.getCompanyContracts().remove(companyContract);
companyContract.setProfile(null);
profileService.update(p);
---> 删除的顺序应该是:
删除发票 --> 时间表 --> 公司契约(Contract),否?
相反,我收到了这个错误:
org.hibernate.exception.ConstraintViolationException: Column 'IDCONTRACT' cannot be null
而且我已经检查过,这个错误发生在 profileService.updateProfile(p);
最佳答案
问题似乎是包含时间表的表中的 IDCONTRACT
列具有 NOT NULL
限制。将其删除并重试。
如果您要自动生成架构,请尝试将 @Basic(optional = true)
添加到 Timesheet.companyContract:
@Basic(optional = true)
@ManyToOne
@JoinColumn(name = "IDCONTRACT")
private CompanyContract companyContract;
关于java - 在 hibernate 中删除订单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46409354/