对象引用未保存的瞬态实例-在刷新之前保存瞬态实例

使用Hibernate保存对象时收到以下错误object references an unsaved transient instance - save the transient instance
摘要由CSDN通过智能技术生成

使用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在这两种情况下解决了这个问题。 这挽救了ChildParent

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

@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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值