您的位置:首页 > 移动开发 > Objective-C

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

2013-09-06 16:34 471 查看
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了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐