- 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")
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
单向配置----你只需保存Ci的时候,不要级联去操作User,但是你必须获得User的id。
你肯定是级联了User的操作,不然不会报这个的。
- Java code
@ManyToOne() private LoanType loanType;//多对一
------解决方案--------------------
@ManyToOne(fetch=FetchType.EAGER,optional=true,cascade="save-update")
试试这个