0

我是 Spring 开发的新手,我正在尝试了解关系注释是如何工作的。我有两个实体,用户和国家。用户与 Country 有 @ManyToOne 关系。

用户实体

@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "user_id")
    private int id;

    @Column(name = "name")
    private String name;

    @ManyToOne
    @JoinColumn(name = "country", foreignKey = @ForeignKey(name = "FK_country"), referencedColumnName = "name")
    private Country country;
    //Other columns, Constructor, Getter, Setter omitted
}

国家实体

@Entity
public class Country {

    @Id
    @Column(nullable=false)
    private String name;

    @Column(nullable=false)
    private String continent;
    //Other columns, Constructor, Getter, Setter omitted
}

它在数据库中创建了我想要的所有内容,但我的问题是当我试图从表单中保存数据时。我的表单将输入名称和所有可能国家/地区之间的选择(之前加载了查询)。提供名称并选择国家后,应在我的 MySQL 数据库中写入带有名称和国家 ID 的行。我收到以下错误:

java.lang.IllegalArgumentException: Parameter value [Spain] did not match expected type [com.model.Country(n/a)]

这是因为它需要 Country 类型,但我确实需要添加一行,其中包含与西班牙关联的名称和 id。我不需要创建整个 Country 对象。我不知道该怎么做,如果我做得正确。有人可以帮帮我吗?提前致谢。

4

2 回答 2

0

您需要保存Country 类对象而不仅仅是country's name,我可以看到 Country 类与您的 User 类映射。
为此,从您从 HTML 中接收的国家/地区的名称/ID 中获取 Country Class 对象,然后将其与您的用户详细信息一起保存。

像这样的东西:-

User user =  getUserById(user_id); //get user's details or create a new User's Object

Country country = getCountryById(country_id); //get Country's object using id or name you're receiving from your HTML-form

user.setCountry(country); //set Country's object in your User's object 

//save user's object 
于 2019-02-07T12:59:08.013 回答
0

也许您可以尝试使用自定义属性编辑器或转换器?它会将字符串转换为您的 Country 对象。

Spring 自定义属性编辑器

于 2019-02-07T13:12:08.640 回答