Java @OneToMany关系不会在子表中保存父表的主键
假设有三个JPA实体。一个Java @OneToMany关系不会在子表中保存父表的主键,java,spring,hibernate,jpa,spring-data-jpa,Java,Spring,Hibernate,Jpa,Spring Data Jpa,假设有三个JPA实体。一个人和与之相关的两个一对多关系。当我试图保存人员时,AD\u P\u ID和AC\u P\u ID外键始终为空。 这些字段的预期值是个人Id。我做错了什么 Person.java:它包含与帐户和地址实体类的一对多关系: @Entity @Table(name = "A2C_PERSON") class Person implements Serializable { private long id; private List<Account>
人
和与之相关的两个一对多关系。当我试图保存人员时,AD\u P\u ID
和AC\u P\u 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_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);
Person p=新人();
账户ac1=新账户();
账户ac2=新账户();
List acList=new ArrayList();
acList.add(ac1);
acList.add(ac2)
地址ad1=新地址();
地址ad2=新地址();
List adList=new ArrayList();
acList.add(ad1);
acList.add(ad2)
p、 setAcs(acList);
p、 setAds(adList);
个人储蓄(p);
对于每个地址
和账户
实体,您需要设置人员
实体。
为了让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);
Person p=新人();
账户ac1=新账户();
ac1.setPerson(p);
List acList=new ArrayList();
acList.add(ac1);
地址ad1=新地址();
ad1.setPerson(p);
List adList=new ArrayList();
acList.add(ad1);
@JoinColumn
表示关系的所有者
“MappedBy”表示反向侧
因此:
@OneToMany(mappedBy=“parent”)
私人收藏儿童收藏;
不会将父引用设置为其子引用。这是你的情况。您可以像Maciej adviced一样手动设置它,但它会添加一些样板代码
要自动将父引用设置为其子引用,必须按以下方式定义关系的所有者
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn
private Collection<Child> childCollection;
@OneToMany(cascade=CascadeType.ALL)
@连接柱
私人收藏儿童收藏;
此抛出异常:调用init方法失败;嵌套异常是org.hibernate.AnnotationException:标记为mappedBy的关联不能定义像[@]JoinTable或[@]JointColumn:com.registration.dao.Person.account这样的数据库映射,无论如何,非常感谢您的回复:)这是有效的,但是@Maxim Popravko的答案在通常情况下更好,当您希望所有事情都自动发生时:)
@OneToMany(mappedBy = "parent")
private Collection<Child> childCollection;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn
private Collection<Child> childCollection;