使用Hibernate保存对象时收到以下错误
object references an unsaved transient instance - save the transient instance before flushing
#1楼
这不是错误的唯一原因。 我刚才遇到此错误是因为我的编码出现错字错误,我相信这会设置已保存的实体的值。
X x2 = new X();
x.setXid(memberid); // Error happened here - x was a previous global entity I created earlier
Y.setX(x2);
我通过确切地找出引起错误的变量来发现错误(在本例中为String xid
)。 我用一个catch
的代码整个块中保存的实体和印刷迹线周围。
{
code block that performed the operation
} catch (Exception e) {
e.printStackTrace(); // put a break-point here and inspect the 'e'
return ERROR;
}
#2楼
我相信这可能只是重复的答案,但为了澄清@OneToMany
,我在@OneToOne
映射以及@OneToMany
上获得了此@OneToMany
。 在这两种情况下,都是我尚未添加到Parent
中的Child
对象尚未保存在数据库中的事实。 因此,当我将Child
添加到Parent
,然后保存Parent
,Hibernate将在保存Parent
抛出"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;
}
#3楼
或者,如果您想使用最小的“功能”(例如,如果您不希望级联删除)来实现所需的功能,请使用
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
...
@Cascade({CascadeType.SAVE_UPDATE})
private Set<Child> children;
#4楼
当Hibernate认为需要保存与要保存的对象关联的对象时,在保存对象时会发生这种情况。
我遇到了这个问题,不想保存对引用对象的更改,因此我希望级联类型为NONE。
诀窍是确保设置了引用对象中的ID和VERSION,以便Hibernate认为引用对象不是需要保存的新对象。 这对我有用。
浏览要保存的类中的所有关系,以计算出关联的对象(以及关联的对象的关联对象),并确保在对象树的所有对象中都设置了ID和VERSION。
#5楼
对于我来说,这是持久存在于数据库中的现有记录的带有@Version注释的字段的值为NULL的实体(用于乐观锁定)时发生的。 在数据库中将NULL值更新为0可以更正此问题。
#6楼
您应该在集合映射中包括cascade="all"
(如果使用xml)或cascade=CascadeType.ALL