[英]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.