当前位置: 首页 > 面试题库 >

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

景俊良
2023-03-14
问题内容

我尝试将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集成,请查看示例。



 类似资料:
  • 我尝试将DTO对象映射到JPA实体。我在我的父母实体中有一个孩子的集合。可以添加它们。Mapstruct通过(http://mapstruct.org/documentation/dev/reference/html/#collection-映射策略)。 如果我创建了新实体,但在添加新子实体之前,无法在更新时清除子实体,则此操作可以正常工作。 Mapstruct手册说(http://mapstru

  • 问题内容: 我发现从Hibernate的集合中删除orphan记录并没有被删除。我一定在做一些简单的错误(这是Hibernate-101!),但是我找不到它。 给定以下内容: 以及以下更新代码: DAO片段: 以下测试失败: 总而言之,我发现: 从作者的藏书中删除该书后,该书仍存在于数据库中 如果我检查,那本书不存在该书 这种“感觉”就像我没有刷新会话或适当地强制进行更新-但我不确定应该在哪里进行

  • 在没有接口构建器的情况下创建视图方面,我是新手。我正在使用创建视图! 如何在重用约束之前删除它?

  • 问题内容: 我在这段代码上遇到了麻烦。 我正在使用一个随机数启动一个计时器,并且我想每秒倒数一次更新JLabel。但是我还没有弄清楚该怎么做,因为计时器触发的唯一侦听器位于它的末尾(我知道)。 这是代码: 问题答案: 我不太了解您为什么使用随机数的问题,但以下是一些观察结果: 我想每秒钟更新一次带有倒计时的JLabel。 然后,您需要将计时器设置为每秒触发一次。因此,计时器的参数是1000,而不是

  • 问题内容: 我正在使用MapStruct库映射对象,但出现此错误: 无法将属性“ java.util.Date aDate”映射到“ javax.xml.bind.JAXBElement ADATE”。考虑声明/实现一个映射方法:“ javax.xml.bind.JAXBElement map(java.util.Date value)”。 我的问题:应该在哪里取消此映射方法? 问题答案: 我通过

  • 问题内容: 我希望将数据保留在localStorage中多长时间。一般用户的localStorage数据将保留多长时间?如果用户不清除它,它将持续到重新安装浏览器? 跨浏览器是否一致? 问题答案: W3C草案对此表示 用户代理应仅出于安全原因或在用户要求时才使本地存储区中的数据过期。用户代理在运行可访问该数据的脚本时应始终避免删除数据。 因此,如果浏览器遵循该规范,则该规范应一直保留到用户在所有浏