Сохранять класс, включающий свойство, которое является идентификатором другого класса

Я довольно новичок в Hibernate, и мне трудно понять, как решить следующую проблему:

У меня есть класс с именем User, который выглядит так:

@Entity
@Table(name = "users")
public class User implements Serializable {

@Id
@Column(name = "id_user")
int id_user;

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

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

@OneToOne 
@JoinColumn(name = "city", referencedColumnName = "id_city", nullable = false, insertable = false, updatable = false)
City city;

И связанный класс:

@Entity
@Table(name = "cities")
public class City implements Serializable {

@Id
@Column(name = "id_city")
int id_city;

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

Как вы понимаете, таблица «Города» содержит все города страны, и их нельзя добавлять или удалять, они просто нужны для ссылок. Я хотел бы, чтобы идентификатор города был сохранен в таблице пользователей (как значение smallint (6)), но это поле остается пустым, когда я сохраняю пользователя. Все остальные поля сохраняются правильно, и я проверил, что во время выполнения свойство city пользователя правильно установлено с городом. Связанный код в моем сервлете:

active = new User();
active.setName(name);
City arrival = (City) session.get(City.class, "1");
active.setArrival(arrival);
session.save(active);
session.getTransaction().commit();

Я не знаю, лучший ли это способ сделать это. Я установил однонаправленное отношение OneToOne между классами. Может быть, это неправильно. Я не знаю, вроде бы все работает нормально, но это свойство. Я проверил множество тем, и эта Hibernate: как сопоставить один с другим, где B является свойством A? похож на мою проблему, но я не могу заставить решение работать на меня.

Любая помощь будет оценена по достоинству.


person Kaliotto    schedule 17.05.2015    source источник
comment
Я предполагаю, что есть несколько пользователей из одной страны, поэтому один к одному неверен. Что вам нужно, так это ManyToOne в классе User.   -  person mh-dev    schedule 18.05.2015
comment
Я установил отношение OneToOne, потому что, хотя это правда, что многие пользователи могут быть из одного города, меня не волнует такой способ отношения. Мне нужно только знать, что для каждого пользователя есть свой город. Я думаю, что это то, что означает однонаправленность, не так ли?   -  person Kaliotto    schedule 18.05.2015


Ответы (1)


Вам необходимо удалить атрибуты 'insertable = false' и 'updatable = false'. Это имело бы смысл, если бы ассоциация была двунаправленной и управлялась с другой стороны (города), что здесь не так.

person Puneet Dev    schedule 18.05.2015
comment
Я не знаю, только ли это из-за этого, но помимо удаления свойств, допускающих значение NULL, вставляемых и обновляемых, я реорганизовал весь код. Я имею в виду, у меня было много комментариев между некоторыми аннотациями и объявлением свойства. Такой бардак: @OneToOne(cascade = CascadeType.ALL) //@ManyToOne //@OneToMany @JoinColumn(name = "city", referencedColumnName = "id_city")//, nullable = false, insertable = false, updatable = false) //@PrimaryKeyJoinColumn City city; Кажется, теперь все работает нормально, без всяких ненужных комментариев. Спасибо! - person Kaliotto; 18.05.2015