微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ModelMapper映射错误的ID

如何解决ModelMapper映射错误的ID

将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/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。