当前位置: 首页 > 知识库问答 >
问题:

将具有ManyToOne关系的属性映射到另一个类的属性

吕飞翼
2023-03-14

今天我遇到了这个烦人的bug,花了我几个小时才解决。我在spring boot申请中有以下enity类

入口模型类

@Data
@Entity
@Table(name="entry")
@NoArgsConstructor(access = AccessLevel.PROTECTED, force = true)
@AllArgsConstructor(access = AccessLevel.PUBLIC)
public class Entry {

@Id
@NotBlank
private String id;

@ManyToOne(targetEntity = User.class)
@JoinColumn(name = "username")
@NotNull
private User username;

@Enumerated(EnumType.STRING)
@NotNull
@Column(name = "type")
private Type Type;

@ManyToOne(targetEntity = Category.class)
@JoinColumn(name = "category")
@NotNull
private Category category;

@NotBlank
@Size(max = 45)
private String description;

@NotNull
private Double amount;

@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd")
@NotNull
private Date date;

@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
@Column(name = "lastUpdate")
@NotNull
private Date lastUpdate;

@NotNull
@Column(name = "isDeleted")
private Boolean isDeleted;

public enum Type {
    Income("I"), Expense("E");

    private String code;

    Type(String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }
}

和用户模型

@Data
@Entity 
@Table(name="user")
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED, force = true)
public class User {

@Id
@Size(max = 45)
private String username;

@Size(max = 100)
private String email;

@Size(max = 60)
private String password;


private Date registeredAt;

private Date lastLoginAt;

public User(String username){
  this.username = username;
  this.email = "";
  this.password = "";
  this.registeredAt = new Date();
  this.lastLoginAt = new Date();
}

}

如您所见,Entry类与User类具有ManyToOne关系(一个用户有许多条目)。如果从User类中删除单参数构造函数并尝试将Entry对象保存到数据库,则会出现以下错误:

JSON分析错误:无法构造com.apboutos.moneytrackbackend.model.user的实例(尽管至少存在一个创建者):没有字符串参数构造函数/工厂方法可从字符串值(“woody”)反序列化;嵌套异常为com.fasterxml.jackson.databind.exc.MismatchedInputExcepthtml" target="_blank">ion:无法构造com.apboutos.MoneyTrackBackEnd.Model.User的实例(尽管至少存在一个创建者):没有字符串参数构造函数/工厂方法可从[源:(PushbackInputStream);行:3,列:16](通过引用链:com.apboutos.MoneyTrackBackEnd.Model.Entry[“用户名”])]处的字符串值(“woody”)反序列化

当我为User类创建单参数构造函数并且正确存储条目时,上述错误就得到了解决。我的猜测是,spring试图实例化User类,当它试图创建Entry类的实例时,将username字符串作为参数传递,由于没有与签名匹配的构造函数,我得到了上面的错误。

因此,我的问题是:有没有什么方法可以在不创建这个蹩脚的单参数构造函数的情况下实现上述结果?例如,我是否可以将Entity类中username属性的类型从User切换到String,并将具有ManyToOne关系的属性映射到User类的username属性,而不是整个类?

共有1个答案

宋望
2023-03-14

我想这个问题可能是因为:

@NoArgsConstructor(access = AccessLevel.PROTECTED, force = true)

尝试将默认构造函数设置为public;有时龙目文注释会使事情变得花样百出。

查看以下问题了解更多详细信息:

>

  • 为什么Hibernate不需要参数构造函数?

    Hibernate使用受保护的默认构造函数失败

  •  类似资料:
    • 在Grails中,当子类可以属于父类中的两个属性之一(但不能同时属于两个属性)时,我很难理解Belongsto-HasMany关系的概念。 例如: 其中Person位于Store.Employees列表或Store.Managers列表中 事先谢谢....

    • 问题内容: 考虑以下类别: 映射到“订单”表。是否可以通过外键关系将客户名属性映射到客户表? 问题答案: 是的,您可以为此使用联接映射元素。另一种选择是映射视图而不是表。但是,如果可能的话,您应该采用面向对象的方法,并绘制订单和客户之间的多对多关系。

    • 早上好 我正在使用ModelMapper将DTO映射到实体,反之亦然,与此相关,我有一个问题。 1)当我从SonController获取SonDTO时,我需要将长的motherId映射到实体Son,但在那里我有实体mothermother来建立关系,它在内部有id。那么我如何将这个SonDTO motherId映射到实体mothermother中,反之亦然? 类以下:

    • CVariacaoTO类有一个复合键(FK\u T、FK\u F、FK\u F\u VARIACAO)。(FK\u F,FK\u F\u VARIACAO)也是Fvariacato表的外键,在多通关系中。 FVariacaoTO类有两个主键,位于@可嵌入类FVariacaoPK中。 此错误已发生:CVariacaoTO. fVariacaoTO的引用列名称(FK_F, ID)未映射到单个属性 CV

    • 问题内容: 我的ViewValue类定义如下: 在我的代码中,我需要将ViewValue实例列表转换为包含来自相应ViewValue的id字段值的列表。 我用foreach循环来做: } 有没有更好的方法来解决这个问题? 问题答案: 编辑:此答案基于以下想法:您需要对代码中其他位置的不同实体和不同属性执行类似的操作。如果您 只需 要按ID将ViewValues列表转换为Longs列表,则请坚持使用

    • 我有一个像这样的对象: 我需要从转换为,所以我尝试了以下方法: 这显然是在上给了我一个错误,因为在类上没有具有单个的构造函数 如何映射的两个属性来创建新的,然后将所有这些属性收集到