Проблема с сохранением данных из HTML-формы (с использованием Thymeleaf), которая имеет отношение внешнего ключа между двумя таблицами с аннотациями Spring и JPA
Я новичок в разработке 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 должна быть записана строка с именем и идентификатором страны. Я получаю следующую ошибку:
java.lang.IllegalArgumentException: Parameter value [Spain] did not match expected type [com.model.Country(n/a)]
Это потому, что для этого требуется тип страны, но мне действительно нужно добавить строку с именем и идентификатором, связанным с Испанией. Мне не нужно создавать весь объект Country. Я не знаю, что делать и правильно ли я делаю. Может кто-нибудь помочь мне, пожалуйста? Заранее спасибо.
2 ответа
Вам нужно сохранить объект класса Country, а не просто country's name
, Как я мог видеть, что класс Country отображается с вашим классом User.
Для этого извлеките объект Country Class из названия / идентификатора страны, которую вы получаете из вашего HTML, а затем сохраните его вместе с вашими данными пользователя.
Что-то вроде этого:-
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.