代码之家  ›  专栏  ›  技术社区  ›  Michel

休眠-具有相同标识符值的其他对象已与会话关联[重复]

  •  1
  • Michel  · 技术社区  · 15 年前

    可能重复:
    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中没有任何更改。a读取实体,然后更改表单中的某些字段,提交后我尝试保存或更新实体。与 int 作为 @Id 没问题,但现在 String 作为 @身份证 我通过更新或保存实体获得上述错误:

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

    有什么问题?

    1 回复  |  直到 14 年前
        1
  •  4
  •   G-Man    14 年前

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

    如果您想插入一个新的对象,您希望它的ID为空或唯一,这取决于您是否使用自动递增(自动递增为空,非自动递增为唯一值),如果您想更新它,您希望确保它附加到上下文。

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

    换言之:

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

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