日期:2014-05-19  浏览次数:20881 次

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") 
试试这个