JPA(休眠)OneToMany关系和null

时间:2011-05-10 09:44:21

标签: jpa one-to-many

我在类Resident和ResidentInfo之间有一个关系OneToMany 如果没有Resident,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;
}

我是JPA的新手,也许我做错了。

问题在于,当我尝试一次插入数据时(同时创建驻留及其信息)我有一个空例外。

这是因为ResidentInfo.resident.id为null(但我无法指定值,因为Resident是在同一时间创建的!)

即使首先创建了居民,我也有这个错误,但我不知道为什么:

detached entity passed to persist: models.ResidentInfo

那么如何解决这些问题?

1 个答案:

答案 0 :(得分:2)

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

public void setResident(Resident resident) {
    this.resident = resident;
}

此外,只能在Resident类中添加ResidentInfo对象到Resident对象。您应该提供一种方法来将新的ResidentInfo对象添加到包含的列表中。添加ResidentInfo对象的一部分是设置与之关联的Resident对象。代码可能看起来像这样

public void addResidentInfo(ResidentInfo residentInfo) {
    residentInfo.setResident(this);
    infos.add(residentInfo);
}

使用这些行,列表中的每个对象都包含对与之关联的Resident实例的引用。因此,当您持久保存所有对象时,将设置必要的引用(以及任何所需的ID)。

在旁注中,您应该检查JPA注释中的Cascade信息。您提供了两种不同含义的注释。