JPA如何删除父项而不删除子项?
我正在尝试删除父项,但我不断收到外键冲突。如果我把Cascade.ALL放在父项中,它也会删除子项。这就是我现在想要的 我有我的家长班:博士班 //bi-directional many-to-one association to Patient @OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH}, orphanRemoval=false, mappedBy="docteur") private List patients; //与患者的双向多对一关联 @OneToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.DETACH},孤立删除=false,mappedBy=“docteur”) 私人名单病人; 我的孩子们很有耐心 我说 @ManyToOne() private Docteur docteur; @ManyToOne() 私人医生; 但就我而言,病人乔尔只有一位医生 在我的经理课上。我尝试了很多没用的东西 这是我的最新版本 Clinique clinique = read(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(clinique); entityManager.persist(clinique); 倩碧倩碧=读取(倩碧ID); Docteur Docteur=entityManager.createNamedQuery(“getDocteur”,Docteur.class).setParameter(“倩碧ID”,倩碧ID).setParameter(“Docteur ID”,doctEU ID).getSingleResult(); clinique.getdocters().remove(docters); entityManager.merge(倩碧); entityManager.Persiste(倩碧); 下面是我得到的错误:JPA如何删除父项而不删除子项?,jpa,cascade,one-to-many,Jpa,Cascade,One To Many,我正在尝试删除父项,但我不断收到外键冲突。如果我把Cascade.ALL放在父项中,它也会删除子项。这就是我现在想要的 我有我的家长班:博士班 //bi-directional many-to-one association to Patient @OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH}, orphanRemoval=false, mappedBy="docteur")
无法删除或更新父行:外键约束失败(
jerabi\u asteriskdb/Patient
,约束FK340C82E5A10F077E
外键(docteur\u docteur\u ID
)引用docteur
(docteur\u ID
),因此关系数据库可以加强数据完整性,必须考虑对引用表中依赖行的引用。SQL 2003指定了5种不同的引用操作:
由于数据库检查patient表中的每个docteur\u id是否引用了有效的docteur,因此会出现外键冲突。这就是外键的全部要点。该数据库确保您不会删除仍由患者引用的医生 为了删除您的医生,您必须确保数据库中没有其他记录引用此医生id。因此,您必须更新此医生的所有患者并将其医生id设置为空:
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会自动更新所有连接的(持久的)实体。不需要持久化和合并它们。阅读。问题在于如何在JPA2.0中做到这一点。简单的SQL很容易。对不起,我提到了Hibernate,也许您正在使用另一个JPA实现。但是,答案仍然是正确的。如果您必须显式地将Docteur对象设置为null,那么使用JPA进行cassade删除的目的不就失败了吗?如果是这样的话,那么我认为编写自己的删除SQL更好,更多的str8转发。@Mr.PortStJoe级联删除将在删除医生时删除医生的患者。OP希望删除医生,但将患者留在数据库中,没有医生。这里没有层叠。谢谢你的澄清。