Я использую ModelMapper для сопоставления DTO с сущностями и наоборот. У меня проблема, когда я сопоставляю ChildDTO
с Child
, где и класс Child
, и класс Parent
имеют свойство с одинаковым именем.
Это объекты:
public class Child {
@Id
@EqualsAndHashCode.Include
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
private String name; // <---- property called 'name'
// other properties
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private Parent parent;
}
public class Parent {
@Id
@EqualsAndHashCode.Include
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
private String name; // <---- property called 'name'
// other properties
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Child> items = new ArrayList<>();
}
public class ChildDTO {
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Long id;
private String name;
// other properties
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Long parentId;
}
А вот код, который выполняет сопоставление:
ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration().setPropertyCondition(Conditions.isNotNull());
modelMapper.getConfiguration().setAmbiguityIgnored(true);
modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
Child childItem = repository.findById(id);
ChildDTO childItemDTO = new ChildDTO();
childItemDTO.setName("new name");
modelMapper.map(childItemDTO, childItem);
В результате оба Child::name
и Parent::name
изменить на «новое имя». Обратите внимание, что я уже использую стратегию отображения STRICT
.
Я также не смог найти способ пропустить вызов Parent::setName()
при отображении с ChildDTO
на Child
Версия ModelMapper: 2.3.2