2011-03-13 100 views
2

我试图删除父母,但我不断收到一个外键违规。如果我将Cascade.ALL放在父级中,它也会删除这些孩子。现在它是我想要的。JPA如何删除没有删除孩子的父母?

我有我的父类:法学博士

 
//bi-directional many-to-one association to Patient 
    @OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH}, orphanRemoval=false, mappedBy="docteur") 
    private List patients; 

和我的孩子是:病人

我把

 
    @ManyToOne() 
    private Docteur docteur; 

但对我来说,患者choul只有一个法学博士。

在我的经理类。我尝试很多东西,没有工作

我在这里的最新版本

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

在这里我得到的错误:

不能删除或更新父行,外键约束失败( jerabi_asteriskdb/Patient,约束FK340C82E5A10F077E外键(docteur_DOCTEUR_ID)参考文献DocteurDOCTEUR_ID))

回答

0

这样一个关系数据库可以执行数据的完整性,以依赖R参数必须考虑引用表中的行为。 SQL 2003指定5个不同的参照动作:

  1. CASCADE:从属行被删除
  2. RESTRICT:删除因错误而失败
  3. 没有施加作用:像删除,但允许触发器先运行,如果他们解决错误
  4. SET NULL:将引用列设置为空(至少一列必须为空)
  5. SET DEFAULT:将引用列设置为其默认值(然后引用表中的另一行,除非至少有一个默认为NULL)
+1

它是如何在JPA 2.0中这样做的问题。简单的SQL会很容易。 – 2011-03-13 22:21:25

5

由于数据库检查患者表中的每个docteur_id都引用了有效的docteur,因此会出现外键冲突。这是外键的全部重点。数据库确保您不会删除仍由患者引用的docteur。

为了删除您的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

+0

对不起,我提到了Hibernate,也许你正在使用另一个JPA实现。但答案仍然存在。 – 2011-03-13 22:25:55

+0

如果你必须明确地将Docteur对象设置为null,那么这不会破坏使用JPA执行cassade删除的目的吗?如果是这种情况,那么我认为编写我自己的删除SQL是更好,更有前途的。 – 2015-03-13 00:23:21

+0

@ Mr.PortStJoe删除docteur时级联删除会删除docteur的患者。 OP想要删除docteur,但将病人留在数据库中,无需docteur。这里没有层叠。 – 2015-03-13 07:13:41

相关问题