Spring boot 为什么在使用mapstruct从DTO映射到实体时不获取id?

Spring boot 为什么在使用mapstruct从DTO映射到实体时不获取id?,spring-boot,mapstruct,Spring Boot,Mapstruct,我有一个带spring boot的API,我使用mapstruct,我只想更新Person实体。为此,有人需要更新人 到目前为止,我所拥有的: 制图员: 在服务层: 查找人: public PersonDto updatePerson(Long personId) { PersonDto personDto = personService.findById(personId) .orElseThrow(() -> new PersonNotFoundException(id

我有一个带spring boot的API,我使用mapstruct,我只想更新Person实体。为此,有人需要更新人

到目前为止,我所拥有的: 制图员:

在服务层: 查找人:

public PersonDto updatePerson(Long personId) {

  PersonDto personDto = personService.findById(personId)
     .orElseThrow(() -> new PersonNotFoundException(id));

  personDto.set(...) //set others properties

  Person person = personMapper.toPerson(personDto);
  person = personMapper.updatePersonFromDto(personDto, person);
  personRepository.save(person); 
  return personMapper.toPersonDto(person);
}`
我的问题是,有没有一种策略或更好的方法来从DTO更新实体

编辑: 我能够解决一个部分,现在我没有丢失id,但我仍然创建了一个新对象,而不是更新它。id位于AbstractPersistableEntity中

@Entity
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Person extends AbstractPersistableEntity<ID> implements Serializable {
  @Column
  private String name;
  @Column
  private String lastName;
  @Column
  private Integer age;
}

public class PersonDto {
   @JsonProperty(access = JsonProperty.Access.READ_ONLY)
   private Long id;
   private String name;
   private String lastName;
   private Integer age;
}

也许这不是最理想或最正确的解决方案,但它是有效的。我对映射器进行了以下修改:

 @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE,
        nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
Person updatePersonFromDto(PersonDto persoonDto, @MappingTarget 
  Person document);

 @ObjectFactory
 default Person updatePerson(PersonDto personDto, Person person){
    if (personDto != null){
        Long id = person.getId();
        Person resultPerson = updatePersonFromDto(personDto, person);
        resultPerson.setId(id);
        return resultPerson;
    }
    return null;
}
然后从服务中拨打:

person = personMapper.updatePerson(personDto, person);

映射器是生成的,因此您希望在这段代码中改进什么?通过将DTO映射到实体,不要丢失id,以便能够更新数据库中的实体,而不是创建新的元组。您可以向我们显示Person和Persondo的代码以及任何可能更改映射器行为的特定设置吗?我更新了映射器此外,在这种情况下,您可能需要实现自己的映射程序
person = personMapper.updatePerson(personDto, person);