Abh*_*ash 4 java spring hibernate jpa spring-data-jpa
假设存在三个 JPA 实体。APerson
和2是一对多的关系。当我尝试保存 Person 时AD_P_ID
,AC_P_ID
外键始终为空。这些字段的预期值是人员 ID。我究竟做错了什么?
Account
Person.java:这包含与Entity 类的一对多关系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;
}
}
Run Code Online (Sandbox Code Playgroud)账户.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;
}
}
Run Code Online (Sandbox Code Playgroud)地址.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;
}
}
Run Code Online (Sandbox Code Playgroud)救人的代码:
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);
Run Code Online (Sandbox Code Playgroud)
@JoinColumn
表示关系的所有者。
“MappedBy”表示反面。
所以:
@OneToMany(mappedBy = "parent")
private Collection<Child> childCollection;
Run Code Online (Sandbox Code Playgroud)
不会将父级引用设置为其子级。这是你的情况。您可以像 Maciej 建议的那样手动设置它,但它会添加一些锅炉代码。
要自动设置父级对其子级的引用,您必须按以下方式定义关系的所有者。
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn
private Collection<Child> childCollection;
Run Code Online (Sandbox Code Playgroud)