协慌网

登录 贡献 社区

如何修复休眠状态 “对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例” 错误

使用 Hibernate 保存对象时收到以下错误

object references an unsaved transient instance - save the transient instance before flushing

答案

您应该cascade="all" (如果使用 xml)或cascade=CascadeType.ALL (如果使用注释)。

发生这种情况是因为您的实体中有一个集合,并且该集合具有一个或多个数据库中不存在的项。通过指定以上选项,您可以告诉 hibernate 在保存其父项时将它们保存到数据库中。

我相信这可能只是重复的答案,但为了澄清@OneToMany @OneToOne映射以及 @OneToMany 上获得了此答案。在这两种情况下,都是我尚未添加到Parent Child对象尚未保存在数据库中的事实。因此,当我将Child添加到Parent ,然后保存Parent ,Hibernate 将在"object references an unsaved transient instance - save the transient instance before flushing"消息。

添加在cascade = {CascadeType.ALL}Parent's参考Child在这两种情况下解决了这个问题。这挽救了ChildParent

对于任何重复的回答,我们深表歉意,只是想为大家进一步澄清。

@OneToOne(cascade = {CascadeType.ALL})
@JoinColumn(name = "performancelog_id")
public PerformanceLog getPerformanceLog() {
    return performanceLog;
}

当 Hibernate 认为需要保存与要保存的对象关联的对象时,在保存对象时会发生这种情况。

我遇到了这个问题,不想保存对引用对象的更改,因此我希望级联类型为 NONE。

诀窍是确保设置引用对象中的 ID 和 VERSION,以便 Hibernate 认为引用对象不是需要保存的新对象。这对我有用。

浏览要保存的类中的所有关系,以计算出关联的对象(以及关联的对象的关联对象),并确保在对象树的所有对象中都设置了 ID 和 VERSION。