Я пытаюсь сопоставить свои объекты DTO с сущностями JPA.У меня есть коллекция children
в моем ParentEntity
.Их можно добавить addChild()
.Использование Adder поддерживается Mapstruct через CollectionMappingStrategy
(http://mapstruct.org/documentation/dev/reference/html/#collection-mapping-strategies).
. Это прекрасно работает, если я создаю новые объекты, но не может очистить дочерние элементы при обновлении перед добавлением новых дочерних элементов.
В руководстве Mapstruct сказано, что (http://mapstruct.org/documentation/dev/reference/html/#updating-bean-instances):
Свойства набора или карты целевого компонента, подлежащего обновлению, будут очищены, а затем заполнены значениями из соответствующей исходной коллекции или карты.
Чего мне не хватает? Есть ли дополнительная опция, которую я должен установить? Есть полный пример с контрольным примером для воспроизведения проблемы на https://github.com/davidfuhr/mapstruct-jpa-child-parent
Вот классы:
public class ParentEntity {
private String name;
private List<ChildEntity> children = new ArrayList<>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<ChildEntity> getChildren() {
return children;
}
public void addChild(ChildEntity child) {
children.add(child);
child.setMyParent(this);
}
public void removeChild(ChildEntity child) {
children.remove(child);
child.setMyParent(null);
}
}
public class ChildEntity {
private String name;
private ParentEntity myParent;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ParentEntity getMyParent() {
return myParent;
}
public void setMyParent(ParentEntity myParent) {
this.myParent = myParent;
}
}
public class ParentDto {
private String name;
private List<ChildDto> children;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<ChildDto> getChildren() {
return children;
}
public void setChildren(List<ChildDto> children) {
this.children = children;
}
}
public class ChildDto {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED)
public interface SourceTargetMapper {
SourceTargetMapper MAPPER = Mappers.getMapper(SourceTargetMapper.class);
ParentEntity toEntity(ParentDto s);
ParentEntity updateEntity(ParentDto s, @MappingTarget ParentEntity e);
@Mapping(target = "myParent", ignore = true)
ChildEntity toEntity(ChildDto s);
}