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

Hibernate-具有相同标识符值的不同对象已与会话关联,hibernate,spring,annotations,entity,validates-uniqueness-of,Hibernate,Spring,Annotations,Entity,Validates Uniqueness Of,可能重复: 从 @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中,没有任何更改。A读取实体,然后

可能重复:

@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中,没有任何更改。A读取实体,然后更改表单中的某些字段,然后在提交后,我尝试保存或更新实体。使用
int
作为
@Id
没有问题,但是现在使用
字符串作为
@Id
我通过更新或保存实体得到上述错误:

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

可能是什么问题?

这表示您试图保存或更新分离的对象,该对象具有非唯一标识符或设置的自动递增标识符

如果要插入新对象,则希望其id为空或唯一,具体取决于是否使用自动递增(自动递增为null,非自动递增为唯一值),如果要更新该对象,则需要确保该对象已附加到上下文

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

换言之:

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

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

这表示您正在尝试保存或更新分离的对象,该对象具有非唯一或设置的自动递增标识符

如果要插入新对象,则希望其id为空或唯一,具体取决于是否使用自动递增(自动递增为null,非自动递增为唯一值),如果要更新该对象,则需要确保该对象已附加到上下文

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

换言之:

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

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

在会话中显示代码可能会有所帮助。在会话中显示代码可能会有所帮助。