Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @OneToMany关系不会在子表中保存父表的主键_Java_Spring_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

Java @OneToMany关系不会在子表中保存父表的主键

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>

假设有三个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> 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;
        }
    }
    
  • 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);
    
    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;