我有三个实体和相关类:BulkEmployee,BulkEmployeeRow和Department BulkEmployeeRow包含BulkEmployee和Department的对象,如下所示:
@ManyToOne
BulkEmployee bulkEmployee;
@ManyToOne(fetch = FetchType.EAGER)
@Cascade(value = { CascadeType.SAVE_UPDATE })
Department department
现在有一个用户界面可以批量创建多个员工。此页面具有自动保存功能,因此任何更改都会触发hibernate saveOrUpdate
用户可以在页面中添加多个员工行。每个员工行都有从现有部门列表中选择部门的选项,或者他们可以填写表单来创建新部门
现在的问题是,当用户为多个员工选择相同的部门时,它会出现以下异常:
org.hibernate.NonUniqueObjectException:与...不同的对象 相同的标识符值已与会话相关联
如果我将部门的CascadeType更改为MERGE,如下所示:
@ManyToOne(fetch = FetchType.EAGER)
@Cascade(value = { CascadeType.MERGE })
Department department
然后为不同的员工选择相同的部门工作正常,但选择新部门会产生以下异常:
org.hibernate.TransientObjectException:object引用未保存的 瞬态实例 - 在刷新之前保存瞬态实例:
有没有办法可以让hibernate做合并,然后只通过注释保存?
答案 0 :(得分:0)
好的,我猜不可能通过注释来做。
所以,正如各地所建议的,我做了
dao.merge(entity)
然后
dao.saveOrUpdate(entity)
解决问题