однонаправленное отображение гибернации «один ко многим» не сохраняет дочернюю таблицу

#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 из адреса, затем повторите описанную выше процедуру