![](/img/trans.png)
[英]ModelMapper: Error mapping ID field from DTO to the ID field on the Entity
[英]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.