当前位置: 代码迷 >> J2EE >> ManyToOne单向配置(异常:object references an unsaved transient instance - save the transient instance before flushing:)
  详细解决方案

ManyToOne单向配置(异常:object references an unsaved transient instance - save the transient instance before flushing:)

热度:214   发布时间:2016-04-22 01:42:25.0
ManyToOne单向配置(错误:object references an unsaved transient instance - save the transient instance before flushing:)
Java code
@ManyToOne(fetch=FetchType.LAZY,optional=true)     @JoinColumn(name = "MAINTAINER",referencedColumnName="ID")    public User getMaintainer() {        return this.maintainer;    }        public void setMaintainer(User maintainer) {        this.maintainer = maintainer;    }


代码如上,这个是Ci对象的一个属性(User类型的)ci和user是多对一的关系,user表没有设置ci信息的外键,二者也没有中间表。在插入Ci信息的时候,也传给了maintainer的id(此Id肯定在Use表里面是存在的)。但是就是报如下错误:

严重: Servlet.service() for servlet default threw exception
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.dhcc.itsm.base.model.User

原因好像是:由于保存Ci时,User还是瞬时态,所以不能保存,而必须User是持久态(在此程序里面就是在保存时根据UserId查处此User对象的信息)才能保存成功。但是我这个ci对象里面有8个对象,一个个手工去查一遍再保存,很累人,况且ci的对象里面还有对象,这样就必须是有的子对象也先查一遍,估计这样的话至少有30多个对象要先查。所以应该可以有其他的解决办法。
希望那位能够帮忙解决只配置Ci这一方的ManyToOne是否就能实现增加。


------解决方案--------------------
要设外键的,再个级联保存时,也就是你的user对象不一定非的是持久化对象,也可以是临时、游离对象
------解决方案--------------------
@ManyToOne(fetch=FetchType.EAGER,optional=true,cascade="save-update")
------解决方案--------------------

------解决方案--------------------
引用楼主 leadergg 的帖子:
代码如上,这个是Ci对象的一个属性(User类型的)ci和user是多对一的关系,user表没有设置ci信息的外键,二者也没有中间表。在插入Ci信息的时候,也传给了maintainer的id(此Id肯定在Use表里面是存在的)。但是就是报如下错误:

------解决方案--------------------
单向配置----你只需保存Ci的时候,不要级联去操作User,但是你必须获得User的id。

你肯定是级联了User的操作,不然不会报这个的。

Java code
 @ManyToOne() private LoanType loanType;//多对一
------解决方案--------------------
@ManyToOne(fetch=FetchType.EAGER,optional=true,cascade="save-update") 
试试这个
  相关解决方案