ModelMapper & JPA:如何将带有 id 的 DTO 映射到具有 oneToMany 字段的实体



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";id";

奖金问题,有没有一种方法可以将其推广到我的其他实体?我可以为每个实体设置自定义映射(没有那么多(,但modelMapper只知道转换";fooId";至Foo实体/参考

我也遇到了同样的问题,这就是我如何将我的DTO与Id列表映射到实体列表(即@ManyToMany(或与@ManyToBone映射到实体的方法。

首先,向您的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;
}
}

然后在您的控制器层或测试类中,您必须按照以下方式制作转换器:

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());
}

最新更新