JPA(hibernate)OneToMany关系和null

JPA(hibernate)OneToMany关系和null,jpa,one-to-many,Jpa,One To Many,我在一个班级的学生和一个学生之间有一个关系 如果没有常驻信息,则不应存在ResidentInfo,但ResidentInfo不是必需的 以下是我的课程: public class Resident { ... @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, mappedBy = "resident") @Cascade({org.hibernate.annota

我在一个班级的学生和一个学生之间有一个关系 如果没有常驻信息,则不应存在ResidentInfo,但ResidentInfo不是必需的

以下是我的课程:

public class Resident {
...
    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, mappedBy = "resident")
    @Cascade({org.hibernate.annotations.CascadeType.ALL})
    public List<ResidentInfo> infos;
}

public class ResidentInfo {
...
    @ManyToOne(optional = false)
    public Resident resident;
    public String label;
    public String value;
}

那么如何解决这些问题呢?

要解决您的问题,首先应该在ResidentInfo类中提供一个setter方法来设置info实例所属的常驻对象。它可能看起来像这样

public void setResident(Resident resident) {
    this.resident = resident;
}
public void addResidentInfo(ResidentInfo residentInfo) {
    residentInfo.setResident(this);
    infos.add(residentInfo);
}
此外,向常驻对象添加ResidentInfo对象只能在常驻类中完成。您应该提供一种方法,将新的ResidentInfo对象添加到包含的列表中。添加ResidentInfo对象的一部分是设置与其关联的常驻对象。代码可能是这样的

public void setResident(Resident resident) {
    this.resident = resident;
}
public void addResidentInfo(ResidentInfo residentInfo) {
    residentInfo.setResident(this);
    infos.add(residentInfo);
}
通过这些行,列表中的每个对象都包含对与其关联的常驻实例的引用。因此,在持久化所有对象时,将设置必要的引用(以及任何必需的ID)


另一方面,您应该检查JPA注释中的级联信息。您提供了两个含义完全不同的注释。

您好,我已取消了“cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH}”是否正确?我还测试了您的代码,这只起到部分作用,当我想向现有居民添加新的居民信息时,这不起作用。您的意思是,它不起作用?使用指定的方法添加新的ResidentInfo时会产生什么结果?我没有错误,但是没有插入所有ResidentInfo记录。您可以提供添加ResidentInfo记录的代码段吗?我解决了这个问题,原因是我的列表未初始化,导致了空异常