从具有 Spring 和 JPA 注释的两个 table 之间具有外键关系的 html 表单(使用 Thymeleaf)保存数据时出现问题
Problem with saving data from a html form (using Thymeleaf) that has a foreign key relation between two table with Spring and JPA annotations
我是 Spring 开发的新手,我正在尝试了解关系注释的工作原理。我有两个实体,用户和国家。用户与国家有@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)]
这是因为它需要国家/地区类型,但我确实需要添加一行,其中包含与西班牙关联的名称和 ID。我不需要创建整个 Country 对象。我不知道该怎么做,也不知道我做的是否正确。
有人可以帮帮我吗?
提前致谢。
您需要保存 国家 class 对象 而不仅仅是 country's name
,因为我可以看到国家 class 映射为您的用户 class.
为此,从您从 HTML 接收的国家/地区的 name/id 中获取 Country Class 对象,然后将其与您的 User[=20= 一起保存] 细节。
像这样:-
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
也许您可以尝试使用自定义 属性 编辑器或转换器?它会将字符串转换为您的 Country 对象。
我是 Spring 开发的新手,我正在尝试了解关系注释的工作原理。我有两个实体,用户和国家。用户与国家有@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)]
这是因为它需要国家/地区类型,但我确实需要添加一行,其中包含与西班牙关联的名称和 ID。我不需要创建整个 Country 对象。我不知道该怎么做,也不知道我做的是否正确。 有人可以帮帮我吗? 提前致谢。
您需要保存 国家 class 对象 而不仅仅是 country's name
,因为我可以看到国家 class 映射为您的用户 class.
为此,从您从 HTML 接收的国家/地区的 name/id 中获取 Country Class 对象,然后将其与您的 User[=20= 一起保存] 细节。
像这样:-
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
也许您可以尝试使用自定义 属性 编辑器或转换器?它会将字符串转换为您的 Country 对象。