在休眠中删除Order

Moa*_*did 8 java mysql spring hibernate

我有4个实体:

与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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

时间表与发票有关系:

@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;
Run Code Online (Sandbox Code Playgroud)

发票:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ID_TIMESHEET")
private Timesheet timesheet;
Run Code Online (Sandbox Code Playgroud)

所以正如你在这里看到的,我正在使用org.hibernate.annotations.CascadeType.DELETE_ORPHAN所以我可以删除父项的子项.

如果我执行这个:

Profile p = companyContract.getProfile();
p.getCompanyContracts().remove(companyContract);
companyContract.setProfile(null);
profileService.update(p);
Run Code Online (Sandbox Code Playgroud)

--->删除顺序应为:

删除发票 - > Timesheets - > CompanyContract,不是吗?

而我得到这个错误:

org.hibernate.exception.ConstraintViolationException:列'IDCONTRACT'不能为null

我已经检查过,这个错误发生在 profileService.updateProfile(p);

Mar*_*aus 2

问题似乎是IDCONTRACT表中保存时间表的列有NOT NULL限制。将其删除并重试。

如果您要自动生成架构,请尝试添加@Basic(optional = true)到 Timesheet.companyContract:

@Basic(optional = true)
@ManyToOne
@JoinColumn(name = "IDCONTRACT")
private CompanyContract companyContract;
Run Code Online (Sandbox Code Playgroud)