【问题标题】:Delete orphans when deleting parent manyToOne annotaion删除父manyToOne注解时删除孤儿
【发布时间】:2017-09-27 10:57:31
【问题描述】:

我有两个实体,相关如下

@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标志吗?
  • 但 orphanRemoval 与 OneToMay 关系一起使用,在我的情况下,我使用的是 ManyToOne 关系
  • ManyToOne 是一种合成关系,在数据库中该关系仅使用OneToMany 关系建模。如果您想在删除 Patient 时删除 Appointments,那么您应该像您一样级联删除操作。 OrphanRemoval 意味着 JPA 将跟踪语法 ManyToOne 集合中的哪些约会,如果您从患者的集合中删除约会,JPA 将在事务提交时将其删除。这有一个(小)成本,因为 JPA 必须在加载 Patient 时跟踪哪些约会存在,并在提交期间进行差异..

标签: java mysql spring hibernate


【解决方案1】:

如果您只想继续将关联用作单向,您可以在字段中定义延迟加载的反向端,而无需为其暴露 getter 和 setter:

@Entity
public class Patient {

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

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

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

【讨论】:

    【解决方案2】:

    您无法在@ManyToOne 端实现该自动行为。它只是在语义上不正确,句号。

    尽管考虑到,您只想拥有一个单向映射并且不指定 Set&lt;Appointment&gt;Patient 的依赖,那么针对您的情况的一种解决方法是替换 @ 987654324@ 与@OneToOne 关系。然后你就可以使用orphan-removal 功能了:

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

    请记住,如果您遵循这条路径,调整您的代码,并且在某些时候您将需要在“患者”方面引入 @OneToMany 依赖项,那么您会偶然发现问题。因此,我建议首先针对未来可能对实体图进行的更改确定利弊。

    【讨论】:

    • 谢谢,我正在将映射更改为 OneToMany 关系
    • @OneToOne 如果你想遵循我的想法;)
    • 我打算将关系的性质改为双向
    • 在双向的情况下,我可以只从多对一端插入,而不是从单对多端插入吗?
    • 是的,你应该有,因为只有 @OneToMany@OneToOne 有这个功能
    猜你喜欢
    • 1970-01-01
    • 2011-01-02
    • 2012-10-22
    • 2012-02-07
    • 1970-01-01
    • 2010-09-23
    • 2014-10-07
    • 2013-06-05
    • 2011-02-09
    相关资源
    最近更新 更多