cascade = CascadeType.ALL会发生什么?

时间:2014-05-06 14:37:06

标签: java hibernate tapestry

我想知道当我使用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从数据库加载。

2 个答案:

答案 0 :(得分:1)

当您使用CascadeType.ALL时,无论何时对父母进行任何操作,所有这些操作也会被级联到孩子身上。

是的,您应该调用saveOrUpdate(parent)

在您的情况下,父对象已经存在。您可以加载现有父级并创建一个新子级并将子级附加到父级,当您调用saveOrUpdate(父级)时,它应该更新父级并创建所有这些子级并将其与该父级关联。

是的,它正在为孩子生成一个id,因为它试图创建一个由于全部级联而生成的子项,你可以将它配置为在@Id中生成id。

使用hibernate.show_sql启用sql日志,以了解更好的事情。

我假设您孩子的@JoinColumn会映射到父主键。

答案 1 :(得分:0)

此问题的原因是在返回结果之前触发刷新的查询查询。解决方案是设置this.session.setFlushMode(FlushMode.COMMIT);

在进行任何查询之前,Hibernate会尝试确保数据库内容是最新的。

https://forum.hibernate.org/viewtopic.php?p=2316849