我想知道当我使用cascade = CascadeType.ALL时会发生什么,
@OneToMany(
mappedBy = "employeeProfile",
cascade = CascadeType.ALL,
orphanRemoval = true)
private List<ProfileEffortAllocation> effortAllocations;
public List<ProfileEffortAllocation> getEffortAllocations() {
if (effortAllocations == null) {
effortAllocations = new ArrayList<>();
}
return effortAllocations;
}
public void setEffortAllocations(List<ProfileEffortAllocation> effortAllocations) {
this.effortAllocations = effortAllocations;
}
我发现当我添加新的jobsAllocation并尝试保存对象,但验证失败导致我的代码无法到达session.saveOrUpdate(parentObj)
时,我仍然得到一个pk而不是null好像在孩子身上要求坚持OneToMany
。在我看到来自effortAllocation的pk之前,我的父对象是否应该调用session.saveOrUpdate(parentObj);
?
我想指出父对象是一个现有对象,并且在添加新子记录之前已使用pk从数据库加载。
答案 0 :(得分:1)
当您使用CascadeType.ALL
时,无论何时对父母进行任何操作,所有这些操作也会被级联到孩子身上。
是的,您应该调用saveOrUpdate(parent)
在您的情况下,父对象已经存在。您可以加载现有父级并创建一个新子级并将子级附加到父级,当您调用saveOrUpdate(父级)时,它应该更新父级并创建所有这些子级并将其与该父级关联。
是的,它正在为孩子生成一个id,因为它试图创建一个由于全部级联而生成的子项,你可以将它配置为在@Id中生成id。
使用hibernate.show_sql
启用sql日志,以了解更好的事情。
我假设您孩子的@JoinColumn
会映射到父主键。
答案 1 :(得分:0)
此问题的原因是在返回结果之前触发刷新的查询查询。解决方案是设置this.session.setFlushMode(FlushMode.COMMIT);
在进行任何查询之前,Hibernate会尝试确保数据库内容是最新的。