使用 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
在这两种情况下解决了这个问题。这挽救了Child
和Parent
。
对于任何重复的回答,我们深表歉意,只是想为大家进一步澄清。
@OneToOne(cascade = {CascadeType.ALL})
@JoinColumn(name = "performancelog_id")
public PerformanceLog getPerformanceLog() {
return performanceLog;
}
当 Hibernate 认为需要保存与要保存的对象关联的对象时,在保存对象时会发生这种情况。
我遇到了这个问题,不想保存对引用对象的更改,因此我希望级联类型为 NONE。
诀窍是确保设置引用对象中的 ID 和 VERSION,以便 Hibernate 认为引用对象不是需要保存的新对象。这对我有用。
浏览要保存的类中的所有关系,以计算出关联的对象(以及关联的对象的关联对象),并确保在对象树的所有对象中都设置了 ID 和 VERSION。