繁体   English   中英

ModelMapper & JPA:如何将带有 id 的 map DTO 转换为带有 oneToMany 字段的实体

[英]ModelMapper & JPA: How to map DTO with id to Entity with oneToMany field

ModelMapper 在将我的实体转换为 DTO 方面一直表现出色,但我无法反过来,因为我的大多数实体至少有一个字段本身就是另一个实体。

团体:

@Entity
@Table(name = "GROUPS_")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Group {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;

    @Column(name = "NAME", nullable = false)
    private String name;

    @ManyToOne
    @JoinColumn(name = "AREA_ID", nullable = false)
    private Area area;
}

区域:

@Entity
@Table(name = "AREAS")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Area {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;

    @Column(name = "NAME", nullable = false)
    private String name;
}

组DTO:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class GroupRequestDTO {
    private String name;
    private Long areaId;
}

我想做的事:

private Group mapToEntity (GroupRequestDTO groupRequestDTO){
    return modelMapper.map(Group.class,groupRequestDTO);
}

我期待的行为(也是我当前的实现)

private Group mapToEntity (GroupREquestDTO groupRequestDTO){
    return new Group(
        null,
        groupRequestDTO.getName(),
        entityManager.getReference(Area.class, groupRequestDTO.getAreaId())
    )
}

知道我的 RequestDTO 将始终具有名称为 [entitiy]Id 的引用实体 id 并且所有实体的 id 都称为“id”可能很有用

额外的问题,有没有办法为我的其他实体概括这一点? 我可以为每个实体设置自定义映射(没有那么多),但是对于 modelMapper 来说,只知道将“fooId”转换为 Foo 实体/引用会很棒

我也遇到了同样的问题,这就是我 map 我的 DTO 的方式,无论是 Id 列表到实体列表(它们是 @ManyToMany)还是带有 @ManyToOne 的实体的 Id。

首先,向您的 Area.java 或子实体添加一个构造函数,如下所示:

@Entity
@Table(name = "AREAS")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Area {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;

    @Column(name = "NAME", nullable = false)
    private String name;

    public Area(Long id) {
        this.id = id;
    }
}

然后在您的 controller 层或您的测试 class 中,您必须按如下方式制作转换器:

    private final ModelMapper mapper = new ModelMapper();
    static {
        Converter<Long, Area> idToArea = ctx -> new Area(ctx.getSource());
        TypeMap<GroupRequestDTO, Group> propertyMapper = 
        this.mapper.createTypeMap(GroupRequestDTO.class, Group.class);
        propertyMapper.addMappings(mapper -> {
            mapper.using(idToArea).map(GroupRequestDTO::getAreaId, Group::setArea);
        });
    }

接下来在您的方法中,您可以执行以下操作:

@Test
public void testMapDTOToEntity() {
    GroupRequestDTO groupRequestDTO = new GroupRequestDTO("Europe",12L);
    Group group = mapper.map(groupRequestDTO,Group.class);
    Assertions.assertEquals(group.getName(), groupRequestDTO.getName());
    Assertions.assertEquals(group.getArea().getId(), 
    groupRequestDTO.getAreaId());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM