让三个JPA实体。一个Person
和两个一对多的关系。当我试图保存Person AD_P_ID
和AC_P_ID
外键总是为空。这些字段的预期值是人员ID。我究竟做错了什么?
@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;
}
}
@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;
}
}
@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);
对于每个Address
和Account
实体,您需要设置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);
@JoinColumn
表示关系的所有者。
“MappedBy”表示反面。
所以:
@OneToMany(mappedBy = "parent")
private Collection<Child> childCollection;
不会为其子项设置父引用。这是你的情况。您可以像Maciej一样手动设置它,但它会添加一些样机代码。
要自动设置对其子项的父引用,您必须按以下方式定义关系的所有者。
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn
private Collection<Child> childCollection;