IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

Suppression en Cascade


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de mhamedbj
    Profil pro
    Inscrit en
    Février 2007
    Messages
    403
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 403
    Par défaut Suppression en Cascade
    Bonjour,

    Le sujet à déjà été traité mais jamais d'une façon claire :

    Voila j'ai un parent qui à plusieurs fils


    Parent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @OneToMany(targetEntity=Fils.class,mappedBy="parent",cascade={CascadeType.ALL})
        private Set<Fils> fils = new HashSet<Fils>();
    FILS


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @ManyToOne(optional=false)
        @JoinColumn(name="Parent_CODE",nullable=false,referencedColumnName="CODE")
        private Parent parent;

    Pour moi l'avantage des JPA c'est de ne plus se préoccuper de l'intégrité référentielle hors c'est pas ce que je constate

    Quand je supprime un parent il faut que tous les fils soient supprimer automatiquement

    hors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Parent p = //parent que je veux supprimer
    em = emf.createEntityManager();
                em.getTransaction().begin();
                Query q = em.createNamedQuery(REM_PARENT);
                q.setParameter("code", p.getCode());
                q.executeUpdate();
                em.getTransaction().commit();
                em.close();
    Mais la ça ne marche pas pour une raison évidente d'intégrité ......

    ja suis obligé de faire une boucle pour supprimer les fils un à un pour que ça marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Parent p = //parent que je veux supprimer
    em = emf.createEntityManager();
                em.getTransaction().begin();
                for (Fils f : a.getFils())
                    em.remove(em.find(Fils.class, f.getId()));
                Query q = em.createNamedQuery(REM_PARENT);
                q.setParameter("code", p.getCode());
                q.executeUpdate();
                em.getTransaction().commit();
                em.close();
    Ou est la logique ? et que l'offre les JPA dans ce cas. ?

    Merci

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    A votre avis, à quoi sert la fonction remove() de l'EntityManager ?

    En exécutant directement un DELETE via un NamedQuery vous court-circuitez la couche JPA et donc vous dépendez directement de comment JPA a traduit la contrainte relationelle dans les limites de ce qui est supporté par le RDBMS sous-jacent… (autrement dit même si cela avait fonctionné, le code ne serait plus indépendant du type de DB…)

  3. #3
    Membre chevronné
    Avatar de mhamedbj
    Profil pro
    Inscrit en
    Février 2007
    Messages
    403
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 403
    Par défaut
    Bonjour,

    Excellent ,


    NB : il faut faire un em.find(e) avant em.remove(e);


    Mais dans ce cas si mes NamedQuery court-circuitent la couche JPA, comment je fait du fine tunning sur les élément de la base

    Ex :

    Si par exemple pour l'élément qui à été supprimer je dois trouver tous les élément de la même hiérarchie et modifier un de leurs attribue :

    1) je dois les chercher un à un avec em.find
    2) retrouver le tout d'un coup avec NamedQuery et je fais mes modifs

    C'est quoi les best practice ??

    Merci

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par mhamedbj Voir le message
    Bonjour,

    Excellent ,


    NB : il faut faire un em.find(e) avant em.remove(e);


    Mais dans ce cas si mes NamedQuery court-circuitent la couche JPA, comment je fait du fine tunning sur les élément de la base

    Ex :

    Si par exemple pour l'élément qui à été supprimer je dois trouver tous les élément de la même hiérarchie et modifier un de leurs attribue :

    1) je dois les chercher un à un avec em.find
    2) retrouver le tout d'un coup avec NamedQuery et je fais mes modifs

    C'est quoi les best practice ??

    Merci
    le best practice, c'est d'abord de comprendre ce qui se passe…

    vous court-circuitez le remove() en exécutant directement DELETE => le cascading n'est plus géré comme espéré…

    vous court-circuitez la mise à jour des champs des entités par des UPDATE => les objets en cache ne seront plus synchro avec la DB, donc vous devez vous-même absolument faire en sorte d'éviter tout conflit de ce côté… (par exemple, n'oubliez pas de mettre à jour l'éventuel champ @Version dans votre update, de vider la cache avant, …)

  5. #5
    Membre chevronné
    Avatar de mhamedbj
    Profil pro
    Inscrit en
    Février 2007
    Messages
    403
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 403
    Par défaut
    Bonjour,


    Très claire, mais j'avoue n'avoir pas trouvé de tuto expliquant de manière claire la philosophie de fonctionnement du TOPLINK, c'est pour ça que je tâtonne.

    Si vous connaissez un totu ou un doc qui reprend tout ces phénomène, (Mise ne cache, gestion des versions, mise en relation des table, etc...)

    Je serais preneur et très reconnaissant.

    PS: celui la n'est pas bon http://tahe.developpez.com/java/jpa/ (en tout cas j'ai pas aimé)

    cdt

Discussions similaires

  1. Suppression en cascade
    Par music03 dans le forum Installation
    Réponses: 1
    Dernier message: 29/07/2005, 20h47
  2. suppression en cascade dans formulaire et sous-formulaire
    Par tooneygirl dans le forum Access
    Réponses: 7
    Dernier message: 20/06/2005, 14h17
  3. Requetes de suppression en cascade
    Par log2n dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 20/05/2005, 10h07
  4. Suppression en cascade
    Par log2n dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/05/2005, 20h33
  5. [debutant]suppression en cascade
    Par christophebmx dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 03/05/2005, 09h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo