130 votes

JPA: suppression unidirectionnelle plusieurs-à-un et en cascade

Dire que j'ai un unidirectionnelle @ManyToOne relation comme suit:

@Entity
public class Parent implements Serializable {

    @Id
    @GeneratedValue
    private long id;
}

@Entity
public class Child implements Serializable {

    @Id
    @GeneratedValue
    private long id;

    @ManyToOne
    @JoinColumn
    private Parent parent;  
}

Si j'ai un parent P et les enfants C1...Cn référencement de retour à P, est-il propre et jolie façon de JPA pour supprimer automatiquement les enfants C1...Cn lorsque P est supprimé (c - entityManager.remove(P))?

Ce que je recherche est une fonctionnalité similaire à ON DELETE CASCADE en SQL.

C'est essentiellement la même question que celle-ci (lien), et de ce que j'ai pu rassembler de cela, la réponse est "non"?

86voto

Vineet Reynolds Points 40529

Les relations en JPA sont toujours unidirectionnel, à moins que vous associez le parent avec l'enfant dans les deux directions. Une cascade de SUPPRIMER les opérations de la mère à l'enfant nécessitera une relation de la mère à l'enfant (et pas seulement l'inverse).

Vous aurez donc besoin de faire cela:

  • Soit, de modifier le unidirectionnelle @ManyToOne relation bi-directionnelle @ManyToOne, ou un unidirectionnelle @OneToMany. Vous pouvez ensuite cascade de SUPPRIMER les opérations de sorte qu' EntityManager.remove supprimera les parents et les enfants. Vous pouvez également spécifier orphanRemoval comme vrai, de supprimer des enfants orphelins lorsque l'entité enfant dans le parent de la collection est nulle, c'est à dire enlever l'enfant quand il n'est pas présent dans n'importe quel parent de la collection.
  • Ou, spécifiez la contrainte de clé étrangère dans la table enfant en tant que ON DELETE CASCADE. Vous aurez besoin d'invoquer EntityManager.clear() après l'appel de EntityManager.remove(parent) que le contexte de persistance doit être actualisé - l'enfant entités ne sont pas censés exister dans le contexte de persistance après qu'ils ont été supprimés dans la base de données.

16voto

tukushan Points 2574

Créez une relation bidirectionnelle, comme ceci:

 @Entity
public class Parent implements Serializable {

    @Id
    @GeneratedValue
    private long id;

    @OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE)
    private Set<Child> children;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X