问题描述
将dto映射到带有嵌套对象的实体时遇到问题。 基本上,“ DayEntry”包含许多“ SingleEntry”,每个“ SingleEntry”都有一个“ Category”。 这是我的实体:
@Entity
public @Data class SingleEntry {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Integer id ;
private float value ;
private boolean isInEntry= true;
@ManyToOne
@JoinColumn(nullable=false)
private Category category;
@ManyToOne
@JoinColumn(nullable=false)
private DayEntry dayEntry;
}
@Entity
public @Data class Category {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Integer id;
@Column(unique = true)
private String name;
private String color ="cc8282";
@OnetoMany(mappedBy = "category")
//@JsonManagedReference
private List<SingleEntry> singleEntryList;
}
@Entity
public @Data class DayEntry {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Integer id;
@Column(nullable = false)
private LocalDate date;
@OnetoMany(mappedBy = "dayEntry",cascade = CascadeType.ALL,fetch = FetchType.EAGER)
private List<SingleEntry> singleEntryList;
}
这是我正在使用的Dto:
public @Data class SingleEntryForCreationDto {
private float value ;
private boolean isInEntry;
private int categoryId;
private int dayEntryId;
}
我正在尝试创建一个新的“ SingleEntity”,这就是为什么在dto中没有“ id”的原因,因为它将要生成,但是当我使用模型映射器时:
modelmapper.map(singleEntryForCreationDto,SingleEntry.class)
它将“ categoryId”映射到实体“ SingleEntry”的“ id”字段,如您在日志示例中所见:
********* dto == SingleEntryForCreationDto(value=50.0,isInEntry=false,categoryId=2,dayEntryId=1)
********* mapped dto == SingleEntry(id=2,value=50.0,category=Category(id=2,name=null,color=cc8282,singleEntryList=null),dayEntry=DayEntry(id=1,date=null,singleEntryList=null))
我查看了modelmapper的文档,并试图更改NamingConventions和Transormation配置,但这没有帮助。我一定会丢失一些东西,而且我肯定不了解modelmapper的工作原理,因为我无法自行修复它。
我将不胜感激。
******编辑: 我仍然不明白为什么将categoryId(SingleEntryForCreationDto)映射到id(SingleEntry)。我现在以这种方式解决了
modelmapper.typeMap(SingleEntryForCreationDto.class,SingleEntry.class).addMappings(mapper -> mapper.skip(SingleEntry::setId));
解决方法
我找不到为什么您的配置会设置SingleEntry的id 2的值,但我认为您最好使用显式映射。
您可以使用PropertyMap配置跳过目标中的任何字段。
显式映射示例:不跳过,但map() http://modelmapper.org/javadoc/org/modelmapper/PropertyMap.html
您可以在此链接的“跳过属性”部分中找到如何使用skip()。 https://docs.docker.com/engine/reference/commandline/history/