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 :

Gestion du CascadeType


Sujet :

JPA Java

  1. #1
    Membre confirmé Avatar de JacNar6
    Homme Profil pro
    Développeur Java/Java EE/Android
    Inscrit en
    Mai 2012
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java/Java EE/Android

    Informations forums :
    Inscription : Mai 2012
    Messages : 163
    Par défaut Gestion du CascadeType
    Bonjour à tous les développeurs. J'ai un soucis, qui me surprends malgré tout.
    Voici une annotation JPA dans un classe que j'ai appelé " Contribuable "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        @OneToOne(cascade = CascadeType.ALL)
        @JoinColumn(name = "idPieceIdentite", nullable = false)
        private PieceIdentite pieceIdentite;
    Cette annotation me permet d'exprimer une relation unidirectionnelle entre la classe Contribuable et la classe PieceIdentite (une PieceIdentite n'a donc pas connaissance de son propriétaire). Ceci marche bien entendu lors de l'insertion dans la base de données (persit) d'une entité de contribuable; Mais lors d'une mise à jour (merge), EclipseLink me renvoie l'erreur ci dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    WARNING: DTX5014: Caught exception in beforeCompletion() callback:
    Local Exception Stack: 
    Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException
    Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '497563529' for key 'UNQ_PIECEIDENTITE_0'
    Error Code: 1062
    Call: INSERT INTO PIECEIDENTITE (ID, DATEDELIVRANCE, LIEUDELIVRANCE, NUMERO, TYPE) VALUES (?, ?, ?, ?, ?)
    il existe bien entendu une contrainte d'unicité sur le numéro d'une pièce d'identité. Pourquoi justement EclipseLink essaie t-il de faire une insertion dans cette table au lieu d'une mise à jour. Si je change le numéro de la pièce d'identité une nouvelle ligne est insérée dans la table concernée, alors que c'est une mise à jour qui est effectuée sur le contribuable. Pourquoi une nouvelle insertion lors d'une mise à jour ? Merci d'avance pour toute vos contributions.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Fais voir le code de mise à jour.

  3. #3
    Membre confirmé Avatar de JacNar6
    Homme Profil pro
    Développeur Java/Java EE/Android
    Inscrit en
    Mai 2012
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java/Java EE/Android

    Informations forums :
    Inscription : Mai 2012
    Messages : 163
    Par défaut
    Voici ce que je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
           PieceIdentite p = new PieceIdentite();
           p.setNumero(numero);
           p.setType(type);
           p.setDateDelivrance(date);
           p.setLieuDelivrance(lieu);
           // Je récupère ici l'ancien Id autogénéré
           p.setId(contribuable.getPieceIdentite().getId());
           contribuable.setPieceIdentite(p);
     
           ContribuableDelegate.edit(contribuable); //edit appel le merge

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Tu devrais récupérer ton objet via une requete ou un find.
    Ensuite tu le modifies puis tu le merges.

  5. #5
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    salut,
    crees tu un nouveau contribuable?
    car ce serait judicieux de faire Pieceidentite piecedidentite = contribuable.getPiecedidentite(), et la tu pourras manipuler la piece d´identité.
    a la fin faire merge.
    Le code ContribuableDelegate.edit(contribuable); peux-tu nous le montrer?
    Eric

  6. #6
    Membre confirmé Avatar de JacNar6
    Homme Profil pro
    Développeur Java/Java EE/Android
    Inscrit en
    Mai 2012
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java/Java EE/Android

    Informations forums :
    Inscription : Mai 2012
    Messages : 163
    Par défaut
    Je précise que ceci est fait à partir d'un client Swing qui utilise une interface distante pour accéder à un EJB déployé sur Glassfish

  7. #7
    Membre confirmé Avatar de JacNar6
    Homme Profil pro
    Développeur Java/Java EE/Android
    Inscrit en
    Mai 2012
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java/Java EE/Android

    Informations forums :
    Inscription : Mai 2012
    Messages : 163
    Par défaut
    Je vais toute suite essayer la proposition de jeffray03 en passant voici le code ContribuableDelegate.edit(contribuable)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        public static void edit(Contribuable contribuable) {
            getContribuableFacadeRemote().edit(contribuable);
        }
     
        private static ContribuableFacadeRemote getContribuableFacadeRemote() {
            ContribuableFacadeRemote contribuableRemote;
            contribuableRemote = (ContribuableFacadeRemote) ServiceLocator.getInstance().getRemoteInterface("contribuableFacade-ejb");
            return contribuableRemote;
        }
    et voici à quoi ressemble la fonction edit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        public void edit(T entity) {
            getEntityManager().merge(entity);
        }

  8. #8
    Membre confirmé Avatar de JacNar6
    Homme Profil pro
    Développeur Java/Java EE/Android
    Inscrit en
    Mai 2012
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java/Java EE/Android

    Informations forums :
    Inscription : Mai 2012
    Messages : 163
    Par défaut
    info supplémentaire: Même si je n'ai pas l'intention d'apporter une modification à la pièce d'identité, mais seulement au contribuable, EclipseLink essaiera toujours une nouvelle insertion de pieceIdentité.

  9. #9
    Membre confirmé Avatar de JacNar6
    Homme Profil pro
    Développeur Java/Java EE/Android
    Inscrit en
    Mai 2012
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java/Java EE/Android

    Informations forums :
    Inscription : Mai 2012
    Messages : 163
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Tu devrais récupérer ton objet via une requete ou un find.
    Ensuite tu le modifies puis tu le merges.
    En dehors de la remarque que j'ai mentionné ci-dessus, il y a aussi le fait qu'une seule IHM gère un contribuable et sa pièce d'identité. Je pensais que le CascadeType.All voulait dire insérer en cascade, mettre à jour en cascade (et non << mettre à jour et insérer >>...), etc.

  10. #10
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    info supplémentaire: Même si je n'ai pas l'intention d'apporter une modification à la pièce d'identité, mais seulement au contribuable, EclipseLink essaiera toujours une nouvelle insertion de pieceIdentité.
    oui mais, ce sera le meme object recuprer dans la base de données, avec new c´est tout une autre reference avec un Id deja existant.

  11. #11
    Membre confirmé Avatar de JacNar6
    Homme Profil pro
    Développeur Java/Java EE/Android
    Inscrit en
    Mai 2012
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java/Java EE/Android

    Informations forums :
    Inscription : Mai 2012
    Messages : 163
    Par défaut
    Citation Envoyé par jeffray03 Voir le message
    oui mais, ce sera le meme object recuprer dans la base de données, avec new c´est tout une autre reference avec un Id deja existant.
    Je vous ai parfaitement compris (à mon avis) dès votre première suggestion. Mais le problème persiste même si je ne réalise aucune action sur l'instance de pieceIdentite; en me contentant par exemple de modifier uniquement l'attribut nom du contribuable et de faire en suite le merge (au travers de la fonction edit). A moins que le problème dans ce cas vienne du fais que l'entity est détaché (j'y accède par une Remote Interface dans mon client swing).

  12. #12
    Membre confirmé Avatar de JacNar6
    Homme Profil pro
    Développeur Java/Java EE/Android
    Inscrit en
    Mai 2012
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java/Java EE/Android

    Informations forums :
    Inscription : Mai 2012
    Messages : 163
    Par défaut
    Mieux vaux tard que jamais. J'ai finalement préféré setter mon instance dans l'ejb (après un find) et non plus dans mon interface swing. cela me rassure que je travail sur une instance de contribuable retourner par EclipseLink. voici ce que je fais dans l'ejb
    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
     
        public Contribuable edit(Contribuable c){
            Contribuable contribuable = em.find(Contribuable.class, c.getId());
            contribuable.setNom(c.getNom());
            contribuable.setPrenom(c.getPrenom());
            ...
            ...
            ...
     
            contribuable.getPieceIdentite().setDateDelivrance(c.getPieceIdentite().getDateDelivrance());
            contribuable.getPieceIdentite().setLieuDelivrance(c.getPieceIdentite().getLieuDelivrance());
            contribuable.getPieceIdentite().setNumero(c.getPieceIdentite().getNumero());
            contribuable.getPieceIdentite().setType(c.getPieceIdentite().getType());
            em.merge(contribuable);
            return contribuable;
        }
    C'est vrai que je ne comprends pas toujours ce qui change l'instance de contribuable récupéré dans swing.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/08/2002, 21h37
  2. Gestion de matrice
    Par bzd dans le forum C
    Réponses: 4
    Dernier message: 12/08/2002, 18h19
  3. Réponses: 4
    Dernier message: 04/07/2002, 12h31
  4. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11
  5. gestion d'un joystick ...
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2002, 12h53

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