Java 无法更新自然主义字段值:实体{Model}的不可变自然标识符已从ABC更改为XYZ

Java 无法更新自然主义字段值:实体{Model}的不可变自然标识符已从ABC更改为XYZ,java,spring-boot,Java,Spring Boot,将spring boot与JPA一起使用: 正在尝试更新表。但当我更新自然字段值时出错 错误:嵌套异常为org.hibernate.HibernateException:实体com.model.Company的不可变自然标识符已从SOL更改为MEP 模型实体: @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "COMPANY_ID") private Long companyId;

将spring boot与JPA一起使用: 正在尝试更新表。但当我更新自然字段值时出错

错误:嵌套异常为org.hibernate.HibernateException:实体com.model.Company的不可变自然标识符已从SOL更改为MEP

模型实体:

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "COMPANY_ID")
  private Long companyId;

  @NotBlank
  @NaturalId
  @Size(max = 5)
  @Column(name = "COMPANY_CODE")
  private String companyCode;    
控制器和服务:

@PutMapping("/company")
public ResponseEntity<?> updateCompany(@Valid @RequestBody CompanyRequest companyRequest) {
    logger.info("UPDATE COMPANY :  {} ", companyRequest);

    Company company = companyService.updateCompany1(companyRequest);

    URI location = ServletUriComponentsBuilder
                .fromCurrentRequest().path("/{companyId}")
                .buildAndExpand(company.getCompanyId()).toUri();

    return ResponseEntity.created(location)
                .body(new ApiResponse(true, "Company Updated Successfully"));
}

//Services:
public Company updateCompany1(CompanyRequest companyRequest) {
        Company company = companyRepository.findById(companyRequest.getCompanyId())
                    .orElseThrow(() -> new ResourceNotFoundException("Company", "companyId", companyRequest.getCompanyId()));
        company.setCompanyCode(companyRequest.getCompanyCode());
        return companyRepository.saveAndFlush(company);
}
@PutMapping(“/company”)
公共响应更新公司(@Valid@RequestBody CompanyRequest CompanyRequest){
info(“更新公司:{}”,公司请求);
Company Company=companyService.updateCompany1(companyRequest);
URI位置=ServletUriComponentsBuilder
.fromCurrentRequest().path(“/{companyId}”)
.buildAndExpand(company.getCompanyId()).toUri();
已创建返回响应属性(位置)
.body(新的ApiResponse(正确,“公司更新成功”);
}
//服务:
上市公司更新公司1(公司请求公司请求){
Company Company=companyRepository.findById(companyRequest.getCompanyId())
.orelsetrow(()->new resource notfoundexception(“Company”、“companyId”、companyRequest.getCompanyId());
company.setCompanyCode(companyRequest.getCompanyCode());
返回公司repository.saveAndFlush(公司);
}
1)在自然属性上设置可变属性,2)使列唯一:

您的映射应该如下所示:

@NotBlank
@NaturalId(mutable=true)
@Size(max = 5)
@Column(name = "COMPANY_CODE", unique=true)
private String companyCode; 

自然id是在域上下文中有意义的不可变标识符。一个典型的例子是图书的ISBN或银行账户的IBAN。它们不会改变,因此当您尝试这样做时会出现例外。但是,您可以将其变为:
@naturaid(mutable=true)
。谢谢。现在,我可以在使用可变true后更新自然字段值。但是,此字段不应重复。我可以创建具有相同值的新记录。如何停止创建重复。。。。???再次感谢。谢谢,它很好用。。。。但为什么我需要删除表并重新构建。。。如果我在模型类中做任何结构更改。。。?like unique=trueUnique在数据库上生成一个唯一的键约束如果有帮助的话,如果您能接受我的答案,我将不胜感激。在我的情况下,重建表是不需要的:我已经有了
@naturaid
unique
约束,只添加了
mutable=true