删除子实体时如何删除父实体?

Posted

技术标签:

【中文标题】删除子实体时如何删除父实体?【英文标题】:How to delete parent entity when deleting child? 【发布时间】:2021-12-20 18:24:34 【问题描述】:

我有两个班级,Parent 和 Child。我想在删除孩子时删除父实体。请注意,孩子不应该知道父母,所以我不能添加反向引用。

        @Getter
@Setter
@Entity
@Table(name = "parent")
public class Parent 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(optional = false)
    @JoinColumn(name = "child_id")
    private Child child;


    @Getter
@Setter
@Entity
@Table(name = "child")
public class Child 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

修改后 这样还是不行

@Getter
@Setter
@Entity
@Table(name = "parent")
public class Parent 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(optional = false, cascade = CascadeType.ALL)
    @JoinColumn(name = "child_id")
    private Child child;


@Getter
@Setter
@Entity
@Table(name = "child")
public class Child 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

【问题讨论】:

你确定,你没有混淆任何东西??在您的模型中:“孩子可以在没有父母的情况下存在”/可以有很多父母!但是“父母不能没有孩子”/有最小/最大/只有一个孩子...... 是的,我敢肯定,在我的情况下,Child 也可以在其他实体中使用 .. 没关系(它在进化中至少发生过一次!..“第一个孩子”可能有“没有父母”;),但命名令人困惑! (对于说英语的人:) 【参考方案1】:

如果您在删除子记录时谈论删除父记录,那么您必须使用级联注释。

【讨论】:

抱歉@Nadim 在添加 Cascade 注释后它仍然无法正常工作。我已经更新了帖子 只需检查 xeex593 发布的答案阅读教程,然后您将根据需要自行修复。双向读取和单向读取【参考方案2】:

添加@OnDelete(action = OnDeleteAction.CASCADE) 后解决了我的问题

@Getter
@Setter
@Entity
@Table(name = "parent")
public class Parent 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(optional = false)
    @JoinColumn(name = "child_id")
    @OnDelete(action = OnDeleteAction.CASCADE)
    private Child child;


@Getter
@Setter
@Entity
@Table(name = "child")
public class Child 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

【讨论】:

【参考方案3】:

通过添加使关系“双向”:

@OneToMany(mappedBy = "child", cascade = CascadeType.REMOVE)
private List<Parent> parents;

.. 到“Child”,并添加一个cascade。 (因此,Child 中的 delete 将级联删除所有 Parents。)

Difference Between One-to-Many, Many-to-One and Many-to-Many?

When Vlad says so

【讨论】:

以上是关于删除子实体时如何删除父实体?的主要内容,如果未能解决你的问题,请参考以下文章

在父对象中删除时从子对象中删除实体子对象的选项

在JPA双向@OnetoMany关系中,当我更新父实体时,子实体在数据库中被删除

克隆 JavaScript 对象时如何排除键列表? [复制]

如何删除关系中的所有子实体?

在JPA中删除子项时保持实体关系同步

Symfony Doctrine:一对多关系正在删除父实体