Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA如何删除父项而不删除子项?_Jpa_Cascade_One To Many - Fatal编程技术网

JPA如何删除父项而不删除子项?

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")

我正在尝试删除父项,但我不断收到外键冲突。如果我把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(倩碧); 下面是我得到的错误:


无法删除或更新父行:外键约束失败(
jerabi\u asteriskdb/Patient
,约束
FK340C82E5A10F077E
外键(
docteur\u docteur\u ID
)引用
docteur
docteur\u ID

,因此关系数据库可以加强数据完整性,必须考虑对引用表中依赖行的引用。SQL 2003指定了5种不同的引用操作:

  • 级联:删除依赖行
  • 限制:删除失败,出现错误
  • 无操作:如删除,但允许先运行触发器,以防它们修复错误
  • SET NULL:将引用列设置为NULL(至少有一列可以为NULL)
  • 设置默认值:将引用列设置为其默认值(然后将引用表中的另一个现有行,除非至少有一个默认值为NULL)

  • 由于数据库检查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希望删除医生,但将患者留在数据库中,没有医生。这里没有层叠。谢谢你的澄清。