当前位置: 首页 > 知识库问答 >
问题:

mapstruct:使用DTO中的数据更新实体的现有字段

颛孙航
2023-03-14

我最近在我的项目中添加了mapStruct。这个框架很酷,但我想不出一件事。

这就是我的情况:我有个人档案和个人类型的实体和字段。我想用ProfileDto更新它。我正在为此使用void fromDto(ProfileDto dto,@MappingTarget Profile entity)方法。问题是,映射器总是创建新的人物,而不是使用个人资料实体中的人物

我的实体是:

public class Profile  {
    private Person person;
    .. setters, getters and  constructors 
}

public class Person extends AbstractEntity {
    private String name;
    private String surname;
    .. setters, getters and  constructors 
}

dto

public class ProfileDto  extends AbstractDto {
    private String name;
    private String surname;
    .. setters, getters and  constructors 
}

我的映射器

public abstract class ProfileMapper {

    @Mappings({
            @Mapping(target = "name", source = "entity.person.name"),
            @Mapping(target = "surname", source = "entity.person.surname")

    })
    public abstract ProfileDto toDto(Profile entity);

    @InheritInverseConfiguration(name = "toDto")
    public abstract void fromDto(ProfileDto dto, @MappingTarget Profile entity);
}

生成的代码

      @Override
        public void fromDto(ProfileDto dto, Profile entity) {
            if ( dto == null ) {
                return;
            }
            Person person = new Person();
            entity.setPerson( person );
...

我不需要在此处创建person的新实例

人员=新人员();

我不知怎么用以下内容替换此字符串:

人员=实体。getPerson()

共有1个答案

赵俊侠
2023-03-14

这是一个已知的问题,请参阅#1011。这已在1.2.0中得到改进(在撰写11.07.2017时,最新版本是1.2.0. Beta3)。您应该尝试最新版本,它应该可以按预期工作。

 类似资料:
  • 我有一种情况,在一个DTO中有另一个DTO,我必须映射到它对应的实体。 我正在使用mapstruct,我已经有antherEntityMapper已经存在。 如何更改EntityMapper接口,以便我可以将一个另一个EntityDTO映射到另一个Entity? 谢谢

  • 问题内容: 我正在使用 MapStruct 进行映射。相同的映射器用于从dto 创建 和 更新 实体。完成dto的id验证,以了解是否必须创建一个新实体(id == null)还是应该从数据库中检索它(id!= null)。 我实际上正在使用MapperDecorator作为解决方法。范例: 映射器 装饰器 但是,由于必须为每个映射器创建一个装饰器,因此该解决方案变得繁重。 有什么好的解决方案吗?

  • 我使用的是spring data jpa,我有一个实体,代码如下: 我使用org . spring framework . data . JPA . repository . JPA repository进行相关的CRUD操作。 当我第一次保存实体(例如creationTimestamp=1)时,方法保存(实体)返回保存的实体(如javadoc所说),其中包含用于进一步操作的新id(如javado

  • 我试图使用MapStruct创建一个“PersondTo”类到“PersonEntity”的映射器 无法将属性“java.util.List Cars”映射到“com.example.car.CarEntity Cars”。考虑声明/实现一个映射方法:“com.example.car.carEntity map(java.util.List value)”。 如果我从Person类中删除“加法器”

  • 生成的父映射器如下所示: 但是当调用时,在子映射器上调用。 相反,我希望调用以下子映射器方法,以合并现有的子实体(假设我们在Dto中不存在的子实体上有其他字段,我们不想丢失这些字段)。 所需的结果是以下或其他等价的结果: