删除父实体的ManyToOne注释时删除孤儿记录

9

我有两个实体,它们之间的关系如下所示:

@Entity
@Table(name = "APPOINTMENT")
public class Appointment {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long codeAp;

    @ManyToOne(fetch = FetchType.EAGER)
,   @OnDelete(action = OnDeleteAction.CASCADE)
    @JoinColumn(name = "codeP")
    private Patient patient;

    //attributes
    //getters and setters
    //constructors



@Entity
@Table(name = "PATIENT")
public class Patient {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long codeP;

    //attributes
    //getters and setters
    //constructors

我正在使用JpaRepository的删除方法。 在数据库中,PATIENT和APPOINTMENT之间存在约束, 当我删除Patient时,我想删除孤儿项。 我添加了@OnDelete hibernate注释,但它对我无效! 你能告诉我为什么吗? 我想保留这种单向关系,你能帮我吗?


你试过使用 orphanRemoval 标记吗? - Mubin
但是orphanRemoval适用于OneToMany关系,在我的情况下,我正在使用ManyToOne关系。 - Student
ManyToOne是一种合成关系,在数据库中,该关系仅使用OneToMany关系进行建模。如果您想在删除患者时删除预约,则应级联删除操作,就像您所做的那样。OrphanRemoval意味着JPA将跟踪哪些预约在合成的ManyToOne集合中,如果您从患者的集合中删除了一个预约,JPA将在事务提交时将其删除。这具有(小)成本,因为JPA必须在加载患者时跟踪哪些预约存在,并在提交期间执行差异。 - Klaus Groenbaek
2个回答

2

如果您只想保持关联关系为单向的话,可以在一个字段中定义延迟加载的反向关系,而无需暴露其getters和setters:

@Entity
public class Patient {

    @OneToMany(mappedBy = "patient", orphanRemoval = true)
    private Collection<Appointment> appointments;
}

这种方式将 orphanRemoval 逻辑应用于患者和他们的预约,作为奖励,您还可以在 HQL 查询中从患者导航到预约。

请注意 mappedBy 属性,它告诉我们预约负责关联管理,因此您可以继续通过在 Appointment 中定义的多对一关系中设置患者来将预约与患者关联。


1

你不可能在@ManyToOne这一侧实现自动行为,这只是语义上不正确的,没有讨论的余地。

考虑到你只想要一个单向映射,并且没有在Patient中指定Set<Appointment>依赖项,那么解决你情况的一种方法是将@ManyToOne替换为@OneToOne关系。然后你就能使用orphan-removal功能:

    @OneToOne(fetch = FetchType.EAGER, orphanRemoval=true)
    @JoinColumn(name = "codeP")
    private Patient patient;

请记住,如果您选择这条路线,调整代码并在某个时候需要在“患者”一侧引入@OneToMany依赖项,则可能会遇到问题。因此,我建议首先就与实体图的未来可能更改制定利弊分析。

谢谢,我正在将映射更改为一对多关系。 - Student
@OneToOne 如果你想跟随我的想法 ;) - Maciej Kowalski
我正在考虑改变关系的性质,使其成为双向的。 - Student
在双向关系中,我是否可以只从ManyToOne一侧插入,而不是从OneToMany一侧插入? - Student
是的,你会有这个功能,因为只有 @OneToMany@OneToOne 有这个特性。 - Maciej Kowalski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接