【问题标题】:JPA (hibernate) OneToMany relationship and nullJPA(休眠)OneToMany 关系和 null
【发布时间】:2011-05-10 09:44:20
【问题描述】:

我在类 Resident 和 ResidentInfo 之间有 OneToMany 关系 ResidentInfo 不应该在没有 Resident 的情况下存在,但 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 为空(但我无法指定值,因为 Resident 是同时创建的!)

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

detached entity passed to persist: models.ResidentInfo

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

【问题讨论】:

    标签: jpa one-to-many


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 嗨,我已经抑制了“cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}”是否正确?我也测试了你的代码,这只是部分工作,当我想向现有居民添加新的 ResidentInfo 时,这不起作用
    • 什么意思,它不起作用?使用指定的方法添加新的 ResidentInfo 会有什么结果?
    • 我没有错误,但没有插入所有 ResidentInfos 记录
    • 能否提供代码 sn-p 用于添加 ResidentInfo 记录?
    • 我解决了这个问题,这是因为我的列表没有初始化导致空异常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2019-11-29
    • 2015-07-27
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多