HibernateException - 域实例的标识符已从 X 更改为 Y

HibernateException- identifier of an instance of Domain was altered from X to Y

我在更新 spring 数据 jpa 中的父记录时出现异常。

这是我的代码:

父实体

@Entity
@Table(name = "CAMP")
@Getter
@Setter
public class Parent extends AbstractEntity  {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tkeygenerator")
@GenericGenerator(name = "tkeygenerator", strategy = "com.custom.TKeyGenerator",
parameters = {@org.hibernate.annotations.Parameter(name = "sequence", value = "TKEY_SEQ")})
@Column(name = "TKEY", nullable = false)    
private String id;
@ManyToOne
@JoinColumn(name = "SUB_CAT_TYPE_CODE", referencedColumnName =   "SUB_CAT_TYPE_CODE")
private Child child;
@Column(name = "DATE")
@Basic
private LocalDate date;
}  

子实体

@Entity
@Table(name = "SUB_CAT_TYPE")
@AttributeOverrides({
@AttributeOverride(name = "code", 
                   column = @Column(name = "SUB_CAT_TYPE_CODE", length = 30)),
@AttributeOverride(name = "description", 
                   column = @Column(name = "SUB_CAT_TYPE_DESC", length = 255))})
@EqualsAndHashCode(callSuper = true)
public class Child extends AbstractTypeDesc {}

测试代码

public Parent update(@PathVariable("id") String id, @Valid @RequestBody  UpdateDto dto) {

      Parent parentObj = parentRepository.findById(id);
      mapper.map(dto, parentObj); // Dozer to map incoming dto to domain                  

      childRepository.findByCode(dto.child().getCode())
                     .map(child -> { 
                           parentObj.setChild(child);
                           return child;
                      });

      return parentRepository.save(parentObj); //Exception occurs here
}    

尝试将父实体中子实体的代码变量更新为 fk 时出现异常。它说 can't alter code from X to Y.

有什么建议吗?

我弄清楚上面的更新代码块出了什么问题 operation.Although 不太清楚为什么它的 happening.Dozer 将 dto 映射到域的映射导致问题它正在更改子实体的值和然后当我试图通过 setter 方法设置子实体时,它导致了 "Id alter exception",虽然我那是同一件事,但我不知道为什么它采取不同的方式。下面是工作代码。

测试代码应该是这样的

public Parent update(@PathVariable("id") String id, @Valid @RequestBody       UpdateDto dto) {

Parent parentObj = parentRepository.findById(id);

childRepository.findByCode(dto.child().getCode())
                 .map(child -> { 
                       parentObj.setChild(child);
                       return child;
                  });
mapper.map(dto, parentObj); // Dozer dto to domain mapping was causing problem                   

return parentRepository.save(parentObj); 
}