【问题标题】:Delete a child from a @OneToMany relationship从@OneToMany 关系中删除一个孩子
【发布时间】:2015-05-05 19:42:17
【问题描述】:

在一对多关系中,如何删除子元素而无需查找并加载父元素、删除元素、更新父元素、然后删除子元素?为了进一步说明我的问题,我有两个类 Foo(父)和 Don(Don 的子):

@Entity
public class Foo {
    @Id
    @GeneratedValue
    private int id;

    @OneToMany
    private List<Don> dons;

    public int getId() {
        return id;
    }

    public List<Don> getDons() {
        // (loads dons as because lazy loading)
        return dons;
    }
}

@Entity
public class Don {
    @Id
    @GeneratedValue
    private int id;

    public int getId() {
        return id;
    }
}

如果我有一个 Don 实例,其中有几个 Foo 引用它,我会得到以下异常:

无法删除或更新父行:外键约束失败

我知道我可以从 Foo 中删除实例,但是有没有办法在不找到 Foo 的情况下删除 Don 实例? (截至性能)

【问题讨论】:

  • 嗨,如果我没记错的话,您只想删除“Don”记录中的一个,对吗?我可以知道您确实找到了解决方案吗?我也有同样的问题..希望你能分享给我:)

标签: java database hibernate one-to-many


【解决方案1】:

this 帖子中所述,需要双向绑定才能删除对象。添加从 Don 到 Foo 的引用并使用 @ManyToOne 注释,并将 mappedBy="parent" 添加到 Foo.dons 解决了我的问题。最终代码:

@Entity
 public class Foo {
    @Id
    @GeneratedValue
    private int id;

    // Added mapped by, which refers to Don.parent
    @OneToMany(mappedBy = "parent")
    private List<Don> dons;

    public int getId() {
        return id;
    }

    public List<Don> getDons() {
        // (loads dons as because lazy loading)
        return dons;
    }
}

@Entity
public class Don {
    @Id
    @GeneratedValue
    private int id;

    // Added parent
    @ManyToOne
    private Foo parent;

    public int getId() {
        return id;
    }

    // Remember to set parent, otherwise we will loose the reference in the database.
    public void setParent(Foo parent) {
        this.parent = parent;
    }
}

【讨论】:

    【解决方案2】:

    我认为您的情况应该是:删除一个 Foos 实例,其中有几个 Dons 引用它

    你可以添加cascade属性,那么当你删除一个Foos实例时,关联的Dons实例会被自动删除而不会出现外键错误:

    @OneToMany(cascade = {CascadeType.ALL})
    private List<Don> dons;
    

    【讨论】:

    • 如果是这样的话,它会起作用的。然而,就我而言,我正在尝试删除 don 实例,而不是 foos。
    猜你喜欢
    • 2017-06-23
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 2016-09-03
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多