Java cascade=CascadeType。所有这些都是什么?

Java cascade=CascadeType。所有这些都是什么?,java,hibernate,tapestry,Java,Hibernate,Tapestry,我想知道当我使用cascade=CascadeType.ALL时会发生什么 @OneToMany( mappedBy = "employeeProfile", cascade = CascadeType.ALL, orphanRemoval = true) private List<ProfileEffortAllocation> effortAllocations; public List<ProfileEffortAl

我想知道当我使用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;
}
@OneToMany(
mappedBy=“employeeProfile”,
cascade=CascadeType.ALL,
(删除=真)
私人名单分配;
公共列表getEffortAllocations(){
if(effortAllocations==null){
effortAllocations=新建ArrayList();
}
回报努力分配;
}
public void setEffortAllocations(列出effortAllocations){
this.effortAllocations=effortAllocations;
}
我发现,当我添加一个新的effortAllocation并尝试保存对象时,由于验证失败,我的代码无法到达
会话。saveOrUpdate(parentObj)
,我仍然得到一个pk,而不是null,就好像在子
OneToMany
上调用persist一样。我的父对象是否应该调用session.saveOrUpdate(parentObj)在我看到effortAllocation的pk之前


我想指出的是,父对象是一个现有对象,在添加新的子记录之前已使用pk从数据库加载。

当您使用
CascadeType.ALL
时,每当您在父对象上执行任何操作时,所有这些操作都将被级联到子对象

是,您应该调用saveOrUpdate(父级)

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

是的,它正在为子对象生成一个id,因为它正在尝试创建一个子对象,因为级联所有,您可以将其配置为在@id中生成id

使用hibernate启用sql日志。显示sql以更好地了解发生了什么


我假设您的孩子中有一个映射到父主键的
@JoinColumn

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

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


你能发布那个错误吗?@Jay没有错误/异常,我只是在保存或更新父对象之前获取子对象的pk。当发生表单验证错误时,这是一个问题,我必须在为父对象运行saveOrUpdate方法之前重新加载带有验证错误的页面。重新加载页面后,子对象现在具有pk id,尽管它们尚未保存到数据库中。每次保存时,如果出现验证错误,则会增加未保存的子对象pk id。@Jay,子对象是否应仅在保存父对象时才持久化?我不确定在保存父对象之前,子对象如何获取其id。我没有调用saveOrUpdate代码中的任何其他地方。只针对最后的父对象。所以我打开查询日志来查找正在发生的插入,我认为删除了其他表查询来查找它最终消失了。此时,我不确定为什么保存期间的查询会在调用saveOrUpdate之前导致插入。有什么想法吗?