@OneToMany关系不保存子表中父级的主键

问题描述 投票:1回答:2

让三个JPA实体。一个Person和两个一对多的关系。当我试图保存Person AD_P_IDAC_P_ID外键总是为空。这些字段的预期值是人员ID。我究竟做错了什么?

  1. Person.java:它包含与Account和Address Entity类的一对多关系 @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);
spring hibernate jpa spring-data-jpa one-to-many
2个回答
2
投票

对于每个AddressAccount实体,您需要设置Person实体。这是必需的,以便hibernate在子节点中保存id:

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);

1
投票

@JoinColumn表示关系的所有者。

“MappedBy”表示反面。

所以:

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

不会为其子项设置父引用。这是你的情况。您可以像Maciej一样手动设置它,但它会添加一些样机代码。

要自动设置对其子项的父引用,您必须按以下方式定义关系的所有者。

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn
private Collection<Child> childCollection;
© www.soinside.com 2019 - 2024. All rights reserved.