java—将具有多个关系的属性Map到另一个类的属性

vngu2lb8  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(318)

今天我遇到了这个恼人的错误,花了我几个小时来解决。我在spring启动应用程序中有以下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类有很多关系(一个用户有很多条目)。如果我从user类中删除单参数构造函数,并尝试将entry对象保存到数据库中,则会出现以下错误:
json分析错误:无法构造的示例 com.apboutos.moneytrackbackend.model.User (尽管至少存在一个创建者):没有要从字符串值('woody')反序列化的字符串参数构造函数/工厂方法;嵌套异常为com.fasterxml.jackson.databind.exc.missmatchdinputException:无法构造的示例 com.apboutos.moneytrackbackend.model.User (尽管至少存在一个创建者):没有字符串参数构造函数/工厂方法从[source:(pushbackinputstream)处的字符串值('woody')反序列化;行:3,列:16](通过引用链:com.apboutos.moneytrackbackend.model.entry[“username”])]
当我为用户类创建单参数构造函数并正确存储条目时,上述错误就解决了。我的猜测是,当spring试图创建entry类的示例时,它试图示例化user类,并将username字符串作为其参数传递,因为没有与该签名匹配的构造函数,所以我得到了上面的错误。
因此,我的问题是:有没有任何方法可以实现上述结果,而不必创建这个黑客式的单参数构造函数?例如,我可以将entity类中username属性的类型从user切换到string,并将该属性与user类的username属性(而不是整个类)Map为manytone关系吗?

6yoyoihd

6yoyoihd1#

我想问题可能是因为:

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

尝试将默认构造函数公开;有时Lombok山的注解会欺骗事物。
有关详细信息,请检查以下问题:
为什么hibernate不需要参数构造函数?
使用受保护的默认构造函数时hibernate失败

相关问题