簡體   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