【问题标题】:mapstruct mapping Entity OneToMany to DTO and reversemapstruct 将实体 OneToMany 映射到 DTO 并反向
【发布时间】:2019-08-17 16:14:06
【问题描述】:

我正在尝试使用mapstruct,我需要将Entity 与子Entity 列表映射,我有关系oneToManymanyToOne,我需要在这两种情况下都进行映射:

@Data
@Entity
public class EmailEntity {

private int id;  

... // some fields

@ManyToOne
private DeliveredEmailInfoEntity deliveredEmailInfo;

}

.

@Data
@Entity
public class DeliveredEmailInfoEntity {

private int id;

... // some fields  

@OneToMany
private List<EmailEntity> emails;

}

映射到:

@Data
public class EmailDTO {

private int id;  

... // some fields

private DeliveredEmailInfoDTO deliveredEmailInfo;

}

.

@Data
public class DeliveredEmailInfoDTO {

private int id;

... // some fields  

private List<EmailDTO> emails;

}

如何以最好的方式做到这一点?

【问题讨论】:

  • 你的问题是循环依赖吗?

标签: java mapstruct


【解决方案1】:

为避免嵌套字段的无限交叉设置,您应该限制这种依赖关系,例如在第二个嵌套级别,即您的根 EmailDTO 将有一个嵌套的 DeliveredEmailInfoDTO 对象(多对一关系),而您的root DeliveredEmailInfoDTO 将拥有嵌套的 EmailDTO 对象列表(一对多关系),并且在下一个嵌套级别上没有任何内容:

@Mapper(uses = DeliveredEmailInfoMapper.class)
public interface EmailMapper {

    @Mapping(target = "deliveredEmailInfo.emails", ignore = true)
    EmailDTO toDTO(EmailEntity entity);

    // other methods omitted 

    @Named("emailDTOList")
    default List<EmailDTO> toEmailDTOList(List<EmailEntity> source) {
        return source
                .stream()
                .map(this::toDTO)
                .peek(dto -> dto.setDeliveredEmailInfo(null))
                .collect(Collectors.toList());
    }
}

@Mapper(uses = EmailMapper.class)
public interface DeliveredEmailInfoMapper {

    @Mapping(target = "emails", source = "emails", qualifiedByName = "emailDTOList")
    DeliveredEmailInfoDTO toDTO(DeliveredEmailInfoEntity entity);

    // other methods omitted 

}

【讨论】:

    【解决方案2】:

    (另见其他答案)

    应该是直截了当的,你的情况没有什么挑战性的:

    @Mapper
    public interface EmailInfoMapper {
    
        EmailDTO entityToDTO(EmailEntity duration);
        EmailEntity dtoToEntity(EmailDTO price);
    
        DeliveredEmailInfoDTO entityToDTO(DeliveredEmailInfoEntity duration);
        DeliveredEmailInfoEntity dtoToEntity(DeliveredEmailInfoDTO price);
    }
    

    您应该在问题中包含您的映射器以及您遇到的问题。

    【讨论】:

    • 这个例子会导致循环相互依赖,最终导致堆栈溢出异常。我会在下面提出一个解决方案,这有助于避免此类瓶颈。
    猜你喜欢
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2018-09-13
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多