1

可能重复:
Spring + Hibernate:具有相同标识符值的不同对象已与会话关联

@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

在 web 应用程序中没有改变任何东西。读取实体,然后更改表单中的某些字段,然后在提交后我尝试保存或更新实体。使用intas@Id没有问题,但现在使用Stringas@Id我通过更新或保存实体得到上述错误:

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

可能是什么问题呢?

4

1 回答 1

4

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

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

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

换句话说:

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

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

于 2011-05-03T19:52:01.193 回答