问题描述
public class SysModel extends BaseEntity<SysModel> {@ManyToOne(cascade = { CascadeType.MERGE })@JoinColumn(name = "PARENT_ID")private SysModel sysModel; .......} 映射文件大概如此, 有一个自关联字段。在操作的时候,遇到一个问题,当此字段为 null 的时候,我可以保存,但是不能更新,报错:Hibernate: update SYS_MODEL set DELETE_FLAG=?, MODEL_NAME=?, ORDER_ID=?, remark=?, PARENT_ID=?, url=?, version=? where id=?2008-09-10 09:55:31,906 ERROR [org.hibernate.event.def.AbstractFlushingEventListener] - <Could not synchronize database state with session>org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.sctt.system.sys.model.bean.SysModelat org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:219)at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397)at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:78)也就是说,PARENT_ID=? 为 NULL 。我基本知道错误原因。但是,我的本条数据,确实 没有外键呀, sysModel = null;如何才能更新 这样的数据呢?往高人回答。
解决方案
同样的操作经常用到,比如部门管理,没有发现这个问题。应该与PARENT_ID=NULL没有关系。你可以试试:1.把当前的实体从父实体中移除:parent.getChildren().remove(child);2.update之前清空session缓存,session.clear()应该可以解决问题.