Отношение @OneToMany не сохраняет первичный ключ родителя в дочерних таблицах - PullRequest
0 голосов
/ 19 октября 2018

Пусть будет три объекта JPA.A Person и два отношения «один ко многим».Когда я пытаюсь сохранить внешние ключи Person AD_P_ID и AC_P_ID всегда равны нулю.Ожидаемое значение для этих полей - идентификатор человека.Что я делаю не так?

  1. Person.java: содержит отношения один ко многим с Account и Address классами сущностей:

    @Entity
    @Table(name = "A2C_PERSON")
    class Person implements Serializable {
    
        private long id;
    
        private List<Account> acs;
    
        private List<Address> ads;
    
        @OneToMany(cascade=CascadeType.ALL, mappedBy = "person")
        public List<Account> getAccount() {
            return this.acs;
        }
    
        @OneToMany(cascade=CascadeType.ALL, mappedBy = "person")
        public List<Address> getAddress() {
            return this.ads;
        }
    }
    
  2. Account.java

    @Entity
    @Table(name = "A2C_ACCOUNT")
    public class Account implements Serializable {
    
        private long id;
    
        private Person person;
    
        @ManyToOne(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
        @JoinColumn(name = "AC_P_ID")
        public Person getPerson() {
            return this.person;
        }
    }
    
  3. Address.java

    @Entity
    @Table(name = "A2C_ADDRESS")
    public class Address implements Serializable {
    
        private long id;
    
        private Person person;
    
        @ManyToOne(cascade=CascadeType.ALL,fetch = FetchType.LAZY)
        @JoinColumn(name = "AD_P_ID")
        public Person getPerson() {
            return this.person;
        }
    }
    

Код для спасения человека:

Person p = new Person();

Account ac1 = new Account();
Account ac2 = new Account();
List<Account> acList = new ArrayList<>();
acList.add(ac1);
acList.add(ac2)

Address ad1 = new Adddress();
Address ad2 = new Adddress();
List<Address> adList = new ArrayList<>();
acList.add(ad1);
acList.add(ad2)

p.setAcs(acList);
p.setAds(adList);

personRepo.save(p);

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

@JoinColumn указывает на владельца отношения.

«MappedBy» указывает обратную сторону.

Итак:

@OneToMany(mappedBy = "parent")
private Collection<Child> childCollection;

не будет устанавливать родительскую ссылку на свой дочерний элемент.Это твой случай.Вы можете установить его вручную, как советовал Maciej, но он добавит некоторый код.

Чтобы автоматически установить родительскую ссылку на его дочерний элемент, вы должны определить владельца отношения следующим образом.

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn
private Collection<Child> childCollection;
0 голосов
/ 19 октября 2018

Для каждого объекта Address и Account необходимо установить объект Person.Это необходимо для того, чтобы Hibernate сохранил идентификаторы у детей:

Person p = new Person();

Account ac1 = new Account();
ac1.setPerson(p);  
List<Account> acList = new ArrayList<>();
acList.add(ac1);

Address ad1 = new Adddress();
ad1.setPerson(p);
List<Address> adList = new ArrayList<>();
acList.add(ad1);
...