gpt4 book ai didi

JPA如何在不删除子项的情况下删除父项?

转载 作者:行者123 更新时间:2023-12-04 08:12:05 27 4
gpt4 key购买 nike

我正在尝试删除 parent ,但我不断收到外键违规。如果我将 Cascade.ALL 放在父级中,它也会删除子级。这就是我现在想要的。

我有我的父类:Docteur

//与患者的双向多对一关联
@OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH}, orphanRemoval=false, mappedBy="docteur")
私有(private)名单患者;

我的 child 是:病人

我把那个

@ManyToOne()
私有(private)博士;

但就我而言,患者周只有一位医生。

在我的经理课上。我尝试了很多没用的东西

这是我的最新版本

倩碧倩碧=读取(clinique_ID);
Docteur docteur = entityManager.createNamedQuery("getDocteur", Docteur.class).setParameter("clinique_ID", clinique_ID).setParameter("docteur_ID", docteur_ID).getSingleResult();

clinique.getDocteurs().remove(docteur);

entityManager.merge(倩碧);

entityManager.persist(倩碧);

这是我得到的错误:

无法删除或更新父行:外键约束失败( jerabi_asteriskdb/Patient ,CONSTRAINT FK340C82E5A10F077E FOREIGN KEY ( docteur_DOCTEUR_ID ) REFERENCES Docteur ( DOCTEUR_ID ))

最佳答案

您会收到外键违规,因为数据库会检查患者表中的每个 docteur_id 是否引用了有效的医生。这就是外键的重点。该数据库确保您不会删除患者仍引用的医生。

为了删除您的docteur,您必须确保数据库中没有其他记录引用此docteur_id。因此,您必须更新此医生的所有患者并将其 docteur_id 设置为 null :

Docteur docteur = entityManager.createNamedQuery("getDocteur", Docteur.class).setParameter("clinique_ID", clinique_ID).setParameter("docteur_ID", docteur_ID).getSingleResult();

for (Patient patient : docteur.getPatients()) {
patient.setDocteur(null);
}
docteur.patients.clear();
clinique.getDocteurs().remove(docteur);

此外,所有附加的(持久的)实体都由 Hibernate 自动更新。无需持久化和合并它们。阅读 http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#objectstate-overview .

关于JPA如何在不删除子项的情况下删除父项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5292404/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com