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 :

Problème de Remove après Persist


Sujet :

JPA Java

  1. #1
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    février 2015
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : février 2015
    Messages : 374
    Points : 144
    Points
    144
    Par défaut Problème de Remove après Persist
    Bonjour,

    J'utilise 2 tables dans ma BDD déclarées comme ceci :

    Table mère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    @Entity
    @Table(name = "RefCollectivite")
    public class RefCollectivite implements Serializable {
     
        @OneToMany(cascade = CascadeType.REMOVE, mappedBy="refCollectivite")
        private Collection<ColPlanCompteM61> listePlanCompteM61;
     
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int idPk;
     
        private String libelle;
     
        public RefCollectivite() {
        }
    Table fille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    @Entity
    @Table(name = "ColPlanCompteM61")
    public class ColPlanCompteM61 implements Serializable{
     
        @ManyToOne
        @JoinColumn(name = "REFCOLLECTIVITEFK", referencedColumnName = "IDPK", insertable = false, updatable = false, nullable = false)
        private RefCollectivite refCollectivite;
     
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int idPk;
        private int refCollectiviteFk;
        private int refPlanCompteM61Fk;
        private Double valeur01;
        private Double valeur02;
        private Double valeur03;
        private Double valeur04;
        private Double valeur05;
        private Double valeur06;
     
        @Transient
        private RefPlanCompteM61 refPlanCompteM61;
     
        public ColPlanCompteM61() {
        }
    Méthode utilisée persister :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        public void creerRefCollectivite(RefCollectivite collectivite) {
            try {
                getEntityManager().persist(collectivite);
                getEntityManager().flush();  
            } catch (Exception e) {
            }
        }
    La suppression en cascade fonctionne bien, sauf dans un cas : après création d'une nouvelle mère.
    Je crée une mère avec ses filles, puis je supprime la mère : il semble ne plus détecter la relation entre les 2 tables et du coup la contrainte de clé étrangère COLPLANCOMPTEM61_REFCOLLECTIVITE_FK provoque une erreur car elle n'est pas respectée (Il ne cherche pas à supprimer les filles).

    J'obtiens l'erreur suivante :

    Internal Exception: java.sql.SQLIntegrityConstraintViolationException: DELETE sur la table 'REFCOLLECTIVITE' a entraîné la violation de la contrainte de clé étrangère 'COLPLANCOMPTEM61_REFCOLLECTIVITE_FK' pour la clé (265). L'instruction a été annulée (rollback).
    Error Code: 20000
    Call: DELETE FROM RefCollectivite WHERE (IDPK = ?) bind => [1 parameter bound]

  2. #2
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    février 2015
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : février 2015
    Messages : 374
    Points : 144
    Points
    144
    Par défaut
    Après insertion d'une mère, le nombre de filles est à 0 alors que 232 lignes sont créées.
    C'est comme si les filles étaient détachées.

    Je sélectionne à nouveau la mère avant de la supprimer, mais l'erreur se produit toujours.
    Est-ce-que j'oublie quelque chose ?
    Merci pour votre aide.

    Mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        public void creerRefCollectivite(RefCollectivite collectivite) {
            try {
                getEntityManager().persist(collectivite);
                getEntityManager().flush();
            } catch (Exception e) {
            }
        }
     
     
        public void supprimerRefCollectivite(RefCollectivite collectivite) { 
            try {
                getEntityManager().remove(rechercherRefCollectivite(collectivite));
            } catch (NoResultException e) {
            }
        }

  3. #3
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    février 2015
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : février 2015
    Messages : 374
    Points : 144
    Points
    144
    Par défaut
    Pour résoudre le problème, après création d'une mère, je dois ajouter les filles créées à la liste des filles de la mère, puis faire un merge de la mère.
    Je ne sais pas si ceci est conforme aux bonnes pratiques, car côté base de données tout est correct : les filles sont bien rattachées à la mère sans avoir à modifier celle-ci.
    Quelqu'un peut me répondre ?
    Merci.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 481
    Points : 48 810
    Points
    48 810
    Par défaut
    Si tu veux que JPA supprime avec la cascade, il faut que l'objet soit complet. Si tu sauve un objet incomplet: genre tu sauve le parent pour les enfant un à un sans jamais mettre les enfant dans la collection du parent, il y a une différence entre ce que JPA voit (ton objet parent sans enfant) et ce que ta base de données vois (des références).

    Le merge résoud le problème mais normalement, à la base, faudrait surtout que tu pense à maintenir tes relation parent / enfant dans ton arbre objet.

  5. #5
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    février 2015
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : février 2015
    Messages : 374
    Points : 144
    Points
    144
    Par défaut
    Ça fonctionne bien avec un merge.
    Merci pour ta réponse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/05/2009, 15h04
  2. problème d'actualisation après persistence
    Par javaphil dans le forum JPA
    Réponses: 3
    Dernier message: 06/09/2007, 12h03
  3. Réponses: 1
    Dernier message: 10/01/2006, 22h37
  4. problème de remove
    Par c_Linoa dans le forum C++
    Réponses: 13
    Dernier message: 28/04/2005, 11h21
  5. Problèmes d'espaces après requete SQL
    Par innosang dans le forum Bases de données
    Réponses: 7
    Dernier message: 29/04/2004, 16h47

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