我有两个实体,相关如下
@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注释,但它对我不起作用! 你能告诉我为什么吗? 我想保持这种单向关系,你能帮助我吗?
答案 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
依赖,那么您将偶然发现问题。因此,我建议首先确定与实体图的未来可能更改相关的优缺点。