Mapstruct:使用加法器时更新时清除集合

我尝试将DTO对象映射到我的JPA实体。我有一个集合children在我的ParentEntity。可以添加它们addChild()。Mapstruct通过CollectionMappingStrategy(http://mapstruct.org/documentation/dev/reference/html/#collection-

mapping-

strategies)支持使用加法器。

如果创建新实体,此方法效果很好,但是在添加新子代之前,在更新时无法清除子代。

Mapstruct手册中说:(http://mapstruct.org/documentation/dev/reference/html/#updating-

bean-

instances):

将清除要更新的目标bean的集合或映射类型的属性,然后使用来自相应源集合或映射的值填充。

我想念什么?我必须设置其他选项吗?在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);

}

回答:

文档中的文字需要改写。问题在于,特别是对于集合而言,在MapStruct中没有开箱即用的好方法来处理它。我目前正在为文档编写一些新文本。

考虑这一点(在考虑MapStruct一般应如何更新集合时):

  • 如果不匹配怎么办:不匹配的元素应该被删除吗?
  • 是否应添加不匹配的源元素?
  • 一场比赛到底是什么构成的:等于?哈希码?比较器== 0?
  • 可以有多个匹配项(列表,但还取决于被视为匹配项的项。)
  • 结果集合应如何排序?
  • 是否应该将新创建的对象添加到持久性上下文?
  • JPA的亲子关系如何?

关于后一种,Dali(Eclipse)还生成remove方法。因此,MapStruct是否应该根据以上情况调用这些方法?

目前,它的工作方式是这样的:每当用户想要一个集合更新方法时,MapStruct都会对元素映射生成常规调用(而不是更新调用),因为这是唯一明智的选择。所有其余部分高度依赖用例。如果您需要事先清除集合,请使用@BeforeMapping清除它。

注意:我刚刚解决了一个问题,该问题也以这种方式处理加法器,而不是您现在得到的模糊错误消息。

如果您想使用一种很好的方式来处理子/父母关系并将其与JPA集成,请查看示例。

以上是 Mapstruct:使用加法器时更新时清除集合 的全部内容, 来源链接: utcz.com/qa/414905.html

回到顶部