删除父manyToOne注释时删除孤立

时间:2017-04-29 11:34:49

标签: java mysql spring hibernate

我有两个实体,相关如下

@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之间存在约束, 当我移除患者时,我想移除孤儿。 我添加了@OnDelete hibernate注释,但它对我不起作用! 你能告诉我为什么吗? 我想保持这种单向关系,你能帮助我吗?

2 个答案:

答案 0 :(得分:1)

如果你想继续只使用单向关联,你可以在一个字段中定义延迟加载的反面,而不会为它公开getter和setter:

@Entity
public class Patient {

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

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

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

答案 1 :(得分:0)

您无法在@ManyToOne方面实现自动行为。它只是在语义上不正确,期间。

考虑到这一事实,您只想拥有单向映射而不指定Set<Appointment>Patient的依赖性,那么对您的情况采取的一种解决方法是用@ManyToOne关系替换@OneToOne。然后,您就可以使用orphan-removal功能:

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

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