Проблема с сохранением данных из html-формы (используя Thymeleaf), которая имеет отношение внешнего ключа между двумя таблицами с аннотациями Spring и JPA - PullRequest
0 голосов
/ 07 февраля 2019

Я новичок в разработке 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 ]

0 голосов
/ 07 февраля 2019

Возможно, вы можете попробовать использовать собственный редактор свойств или конвертер?Он преобразует строку в ваш объект Country.

Редактор пользовательских свойств Spring

0 голосов
/ 07 февраля 2019

Вам нужно сохранить объект класса 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 
...