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

Abh*_*ash 4 java spring hibernate jpa spring-data-jpa

假设存在三个 JPA 实体。APerson和2是一对多的关系。当我尝试保存 Person 时AD_P_IDAC_P_ID外键始终为空。这些字段的预期值是人员 ID。我究竟做错了什么?

  1. AccountPerson.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)
  2. 账户.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)
  3. 地址.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)

Max*_*vko 5

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

  • 这会抛出异常:调用 init 方法失败;嵌套异常是org.hibernate.AnnotationException:标记为mappedBy的关联不得定义数据库映射,例如[@]JoinTable或[@]JoinColumn:com.registration.dao.Person.account无论如何,非常感谢您的回复:) (2认同)