Hibernate - 具有相同标识符值的不同对象已与会话关联

时间:2010-07-16 14:17:38

标签: hibernate spring annotations entity validates-uniqueness-of

  

可能重复:
  Spring + Hibernate : a different object with the same identifier value was already associated with the session

更改实体@id
@Id
private int getId(){
     return this.id;
}

@Id
private String getLogin(){
     return this.login;
}

我收到错误:

a different object with the same identifier
value was already associated with the session

在webapplication中没有改变任何东西。读取实体然后更改表单中的某些字段,然后在提交后我尝试保存或更新实体。使用int作为@Id没有问题,但现在将String作为@Id我通过更新获得上述错误或保存实体:

 @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
 public void saveOrUpdate(User u) {  
  getHibernateTemplate().saveOrUpdate(u);  
 }

可能是什么问题?

1 个答案:

答案 0 :(得分:4)

这意味着您正在尝试保存或更新具有非唯一或设置自动递增标识符的分离对象。

如果要插入新对象,您希望它的id为空或唯一取决于您是否使用自动增量(对于自动增量为null,使用非自动增量的唯一值设置),如果您想要更新它,你想确保它附加到上下文。

您可以使用session.merge(object)将对象重新附加到上下文,该对象返回对象的附加版本。

换句话说:

如果您尝试插入,请确保如果您使用自动增量或者是唯一的,则配置为Id的字段为空。

如果您要更新,请确保已附加对象。 您可以通过从数据库中选择它(基于您拥有的字段),进行更改,然后更新,或者只调用session.merge(object)方法并接收对象的附加版本来执行此操作。也更新。