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