2017-09-05 122 views
1

我們無法刪除父級(Solicitud)定義爲級聯的子實體(SolicitudArxiu),如我們可以在下面看到的。無法刪除OneToMany與JPA的子實體關係

似乎父級(級聯)實體中關係的定義影響從子級刪除,因爲當我刪除級聯時,刪除就起作用。

是否存在強制刪除小孩(SolicitudArxiu)的表單?

SolicitudArxiuManager(子實體刪除)

public void delete(int id) { 
    try { 
     SolicitudArxiu reference = this.em.getReference(SolicitudArxiu.class, id); 
     this.em.remove(reference); 
    } catch (EntityNotFoundException e) { 
     //we want to remove it 
     logger.error("Entity not found exeption: ", e); 
    } 
} 

Solicitud(母公司)

@Entity 
@Table(name = "t_solicitud") 
public class Solicitud implements Serializable { 
... 
    @OneToMany(mappedBy = "solicitud", cascade = CascadeType.ALL, orphanRemoval = true, 
      fetch = FetchType.EAGER) 
    private Collection<SolicitudArxiu> sarxius; 
    ... 

SolicitudArxiu.java

@Entity 
@Table(name = "r_solicitudArxiu", 
     uniqueConstraints = @UniqueConstraint(columnNames = {"idSolicitud","idArxiu"})) 
public class SolicitudArxiu implements Serializable { 
... 
    @ManyToOne 
    @Basic(optional = false) 
    @JoinColumn(name = "idSolicitud", referencedColumnName = "id", 
      foreignKey = @ForeignKey(name = "solicitudArxiu2solicitud")) 
    private Solicitud solicitud; 

    @ManyToOne 
    @Basic(optional = false) 
    @JoinColumn(name = "idArxiu", referencedColumnName = "id", 
      foreignKey = @ForeignKey(name = "solicitudArxiu2arxiu")) 
    private Arxiu arxiu; 
    ... 

enter image description here

回答

0

您不能刪除實體而不從關係中刪除關係,所以先刪除關係然後刪除您的孩子。

+0

這就是我想要做的,我試圖刪除t_solicitud和t_arxiu之間的關係,但是在執行em.remove之後,實體仍然存在。 ¿? – Joe

+0

如果您在刪除實體時使用jpa 2.0或更高版本,則子級將保留,除非您將orphanRemoval定義爲true,因此要麼刪除該關係,然後刪除該實體,要麼將orphanRemoval定義爲true,以便在關係被刪除時子代將被刪除 –

+0

@Joe我剛剛注意到你已經有了orphanRemoval設置,然後刪除關係就足以刪除子節點 –

0

我終於決定用createNativeQuery來做到這一點,並避免了JPA關係的限制。

em.createNativeQuery("DELETE FROM r_solicitudArxiu WHERE id = ?") 
    .setParameter(1, id) 
    .executeUpdate();