【发布时间】:2019-06-21 21:53:28
【问题描述】:
我有一个带有 Spring Boot 的 API,我使用 mapstruct,我只想更新 Person 实体。为此,让 PersonD 更新 Person。
到目前为止我所拥有的: 映射器:
@Mapper
public interface PersonMapper {
PersonDto toPersonDto(Person person);
Person toPerson(PersonDto personDto);
Person updatePersonFromDto(PersonDto persoonDto, @MappingTarget
Person document);
}
-
在服务层: 找人:
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;
}
【问题讨论】:
-
映射器已生成,您希望在此代码中改进什么?
-
不要通过将 DTO 映射到实体来丢失 id,以便能够更新数据库中的实体而不是创建新的元组。
-
您能否向我们展示一下 Person 和 PersonDto 的代码以及任何可以改变映射器行为的特定设置?
-
我也更新了映射器。
-
在这种情况下,您可能必须实现自己的映射器
标签: spring-boot mapstruct