关于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
在*上看到说:去掉version版本控制字段,就可以啦!试了下果然保存成功,但是我想如果我又想保留版本字段呢?我就手动随便设置了一个版本号,居然也成功了!
最后我把private Integer version;改成private Integer version=0;问题解决。
具体原因还需要深究下,肯定是和版本号有关系了。希望路过的大神指导一下。