关于save the transient instance before flushing

      org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing       

 

     碰到这个问题有一阵子了,今天花了一天时间,总算是解决了,虽然不是很明白原理是什么,期待大神指导酷

       现在又两个类Child和Parent,代码(简版)如下:

       

public class Child {
    private String id;
    //版本控制字段
    private Integer version;
    private String name;
    private Parent parent;
}

 

public class Parent {
    private String id;
    //版本控制字段
    private Integer version;
    private String name;
    private Set<Child> children;
}

 

    这个异常发生在manytoone关系上,比如:保存child。

 

   这里顺便提下这个场景会发生的问题:

<input name='child.parent.id' value=''>

    由于html表单提交的时候,没有复制的字段默认是空串,提交的parent id 是空的肯定会报错,网上有人说设置:optional = true(配置文件对应not-null=false)这是解决不了问题的,因为你页面还是提交了一个空值给后台,所以如果不设置parent则在页面不提交child.parent.id,这个可以用js控制(disabled)。

 

 

  进入正题问题重现parent:我要保存child并关联parent

 

<input name='child.parent.id' value='xxx'>

  依然抛出异常:object references an unsaved transient instance - save the transient instance before flushing     

   在stackoverflow上看到说:去掉version版本控制字段,就可以啦!试了下果然保存成功,但是我想如果我又想保留版本字段呢?我就手动随便设置了一个版本号,居然也成功了!

   最后我把private Integer version;改成private Integer version=0;问题解决。

  具体原因还需要深究下,肯定是和版本号有关系了。希望路过的大神指导一下。

 

    

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值