object references an unsaved transient instance - save the transient instance before flushing



hibernate报object references an unsaved transient instance - save the transient instance before flushing如此错误解析:

1.如果想级联保存对象,但是没有配置级联保存就会报如此错误:

比如账户和用户两张表,在保存账户的时候级联保存用户,两个正确配置如下:

账户表中关联用户的配置

@OneToOne(optional=false,fetch=FetchType.LAZY)    @JoinColumn(name="sem_user_id", unique=true, nullable=false, updatable=false)@Cascade(value=org.hibernate.annotations.CascadeType.ALL)@Fetch(FetchMode.SELECT)public User getUser() {return user;}public void setUser(User user) {this.user = user;}

用户表中关联的账户表的配置

@OneToOne(mappedBy = "user")public Account getAccount() {return account;}public void setAccount(Account account) {this.account = account;}

错误配置如下:

账户表中关联用户的配置

@OneToOne(optional=false,fetch=FetchType.LAZY)    @JoinColumn(name="sem_user_id", unique=true, nullable=false, updatable=false)@Fetch(FetchMode.SELECT)public User getUser() {return user;}public void setUser(User user) {this.user = user;}

用户表中关联的账户表的配置

@OneToOne(mappedBy = "user")public Account getAccount() {return account;}public void setAccount(Account account) {this.account = account;}

这样就会报object references an unsaved transient instance - save the transient instance before flushing: com.future.feoa.entity.User这样的错误!

2.是我正式阐述的,今天同事遇到object references an unsaved transient instance - save the transient instance before flushing这个错误让我看,因为他有级联保存,我一直以为是级联保存的时候出错了,折腾了几个小时,最后经过反复dug调试发现不是级联保存的错误,是保存的级联对象的关系属性的错误。具体如下:

如果不是级联保存,是保存单个对象,而这个有关联的对象,你的页面可以对这个关联对象不选值,就是给关联对象不选id值,这样的话struts会把你的关联对象重新new一个空对象赋给此对象,而这个空对象在数据库肯定是没有的,所以在保存该对象的时候就会报关联的没选值的对象为瞬时态的错误。

怎么解决了?

例如:还是用户和部门两个实体。保存用户的时候页面没有给用户所在部门选值

这样就得在hibernate保存之前做一下判断将所属部门置为null值(注意用户实体配置必须配置所属部门可为null)如下:

if(null!=user.getDept()&&null==user.getDept().getId()){

user.setDept(null);

}

如此处理就ok了。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hay_lee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值