Hibernate: How to fix “identifier of an instance altered from X to Y”?

后端 未结 17 2393
org.hibernate.HibernateException: identifier of an instance 
of org.cometd.hibernate.User altered from 12 to 3

in fact, my user table

17条回答
  •  渐次进展
    2020-12-01 07:42

    I was facing this issue, too.

    The target table is a relation table, wiring two IDs from different tables. I have a UNIQUE constraint on the value combination, replacing the PK. When updating one of the values of a tuple, this error occured.

    This is how the table looks like (MySQL):

    CREATE TABLE my_relation_table (
      mrt_left_id BIGINT NOT NULL,
      mrt_right_id BIGINT NOT NULL,
      UNIQUE KEY uix_my_relation_table (mrt_left_id, mrt_right_id),
      FOREIGN KEY (mrt_left_id)
        REFERENCES left_table(lef_id),
      FOREIGN KEY (mrt_right_id)
        REFERENCES right_table(rig_id)
    );
    

    The Entity class for the RelationWithUnique entity looks basically like this:

    @Entity
    @IdClass(RelationWithUnique.class)
    @Table(name = "my_relation_table")
    public class RelationWithUnique implements Serializable {
    
      ...
    
      @Id
      @ManyToOne
      @JoinColumn(name = "mrt_left_id", referencedColumnName = "left_table.lef_id")
      private LeftTableEntity leftId;
    
      @Id
      @ManyToOne
      @JoinColumn(name = "mrt_right_id", referencedColumnName = "right_table.rig_id")
      private RightTableEntity rightId;
    
      ...
    

    I fixed it by

    // usually, we need to detach the object as we are updating the PK
    // (rightId being part of the UNIQUE constraint) => PK
    // but this would produce a duplicate entry, 
    // therefore, we simply delete the old tuple and add the new one
    final RelationWithUnique newRelation = new RelationWithUnique();
    newRelation.setLeftId(oldRelation.getLeftId());
    newRelation.setRightId(rightId);  // here, the value is updated actually
    entityManager.remove(oldRelation);
    entityManager.persist(newRelation);
    

    Thanks a lot for the hint of the PK, I just missed it.

提交回复
热议问题