#hibernate #annotations #one-to-many
#гибернация #аннотации #один ко многим
Вопрос:
У меня есть две таблицы с именем Person
и Address
. Эти таблицы я сопоставил один ко многим с помощью гибернации с использованием аннотаций.
Затем в моей родительской сущности Person
я создаю a Set<Address>
для хранения дочернего класса. После этого я создаю набор адресов и устанавливаю значение Person
entity, а также устанавливаю собственные значения Person.
Моя проблема в том, что когда я сохраняю дочерний элемент родительского объекта, он не сохраняется в БД.
Вот мой код:
Person.java
@Entity
@Table(name="PERSON")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="personId")
private int id;
@Column(name="personName")
private String name;
@OneToMany(cascade =CascadeType.ALL,fetch = FetchType.EAGER)
@JoinColumn(name="personId")
private Set <Address> addresses;
Address.java
@Entity
@Table(name = "ADDRESS")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "addressId")
private int id;
@Column(name = "address")
private String address;
@Column(name="personId")
private int personid;
Мой DAO:
public Person addNewPerson() {
Person per = new Person();
per.setName("aaaa person");
Set<Address> addressSet = new HashSet<Address>();
for(int i = 0; i<=3;i ){
Address ad = new Address();
ad.setAddress("aaa " i);
addressSet.add(ad);
}
per.setAddresses(addressSet);
getHibernateTemplate().save(per );
}
Здесь пользователь добавляет в мою таблицу, но адрес не сохраняется. Почему?
двунаправленный это возможно, но в однонаправленном — моя проблема
Ответ №1:
personId
Столбец сопоставляется дважды: один раз для хранения внешнего ключа для пользователя адреса, используя JoinColumn
аннотацию, и один раз как обычный int
столбец в адресе.
Удалите personId
поле из адреса. Если вы хотите получить доступ к идентификатору пользователя по адресу, затем сопоставьте ассоциацию как двунаправленную ассоциацию OneToMany / ManyToOne.
Комментарии:
1. я удалил PersonID из адреса, затем повторите описанную выше процедуру