微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

嵌套对象的ModelMapper Set属性

如何解决嵌套对象的ModelMapper Set属性

有没有一种方法可以配置模型映射器以自动将父ID映射到嵌套子对象中的父ID?

父实体

@Entity
@Table(name = "parent")
public class ParentEntity {

    @Id
    @Column(name = "id")
    private Long id;

    @Basic
    @Column(name = "name")
    private String name;

    @OnetoMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "parent_id",referencedColumnName = "id")
    private List<ChildEntity> child;

子实体

@Entity
@Table(name = "child")
public class ChildEntity {

    @Id
    @Column(name = "id")
    private Long id;

    @Basic
    @Column(name = "parent_id")
    private Long parentId;

    @Basic
    @Column(name = "name")
    private String name;

家长DTO

public class ParentDto {
    
    private Long id;
    private String name;
    private List<ChildDto> children;

儿童DTO


public class ChildDto {

    private Long id;
    private Long parentId;
    private String name;

目前,Im使用模型映射器,并且它的转换大部分工作,并且它创建带有ParentEntity对象列表的ParentEntity对象。现在,我正在寻找一种用modelmapper填充每个ChildEntity中“ parentId”字段的方法。预先感谢!

/*
{
  id: 1,name: "dad",children: [
    {
      id:10,name: "child",},{
      id:20,name: "child2",}
  ]
}
*/
modelmapper.map(parentDto,ParentEntity.class)

解决方法

面临的挑战是,在映射ChildDto时,您必须有权访问具有ParentDto 孩子List,其中ChildDto要映射的已添加。否则,映射器将不知道该ID。

幸运的是,您可以在ParentDto的帮助下访问org.modelmapper.Converter。像这样实现此接口:

public Converter<ChildDto,ChildEntity> converter = new Converter<>() {
    private final ModelMapper mm = new ModelMapper();
    @Override
    public ChildEntity convert(MappingContext<ChildDto,ChildEntity> context) {
        // map it first normally
        ChildEntity ce = mm.map(context.getSource(),ChildEntity.class);
        try {
            // 1st parent is the List 2nfd is the ParentDto
            ParentDto parentDto = (ParentDto)context.getParent().getParent().getSource();
            ce.setParentId(parentDto.getId());
        } catch (Exception e) {
            // well,maybe it was not ParentDto that expected to be the grandparent.
        }
        return ce;
    }
};

然后像这样使用它:

ModelMapper mm = new ModelMapper();
mm.addConverter(converter);

和没有ChildDto的{​​{1}}应该仍然用parentId映射到ChildEntity

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。