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 :

Modification de la valeur d'une entité @ManyToOne


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 45
    Par défaut Modification de la valeur d'une entité @ManyToOne
    Bonjour,

    J'aimerais pouvoir modifier la valeur d'une entité liée, qui dans le cas présent se nomme "Chauffeur".

    Dans le premier cas j'ai créé le champ avec une valeur null :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     reservation.setChauffeur(null);
    Mais lorsque je veux modifier la valeur, un message d'erreur s'affiche.
    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
     public class Reservation implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Basic(optional = false)
        @Column(name = "ID_RESV")
        private Integer idResv;
        @Column(name = "DateResv")
        @Temporal(TemporalType.TIMESTAMP)
        private Date dateResv;
        @Column(name = "destination")
        private String destination;
        @Column(name = "objetResv")
        private String objetResv;
        @Column(name = "DATE_DEBUT")
        @Temporal(TemporalType.TIMESTAMP)
        private Date dateDebut;
        @Column(name = "DATE_FIN")
        @Temporal(TemporalType.TIMESTAMP)
        private Date dateFin;
    @JoinColumn(name = "NumSOM", referencedColumnName = "NUM_SOM")
        @ManyToOne
        private Chauffeur chauffeur;
     
    //////////////
    Voici le code de modification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      public void ConfirmerReservation(Integer id,Integer IdChau,String conf) throws IllegalStateException{
     
            Query q=em.createQuery("UPDATE Reservation e SET "
                    + "e.confirmation=:conf,"
                    + "e.chauffeur.numSom=:IdChau WHERE e.idResv = :id");
                    q.setParameter("conf", conf);
                    q.setParameter("IdChau", IdChau);
                    q.setParameter("id", id);
                    int updated = q.executeUpdate();
       }
    Et le message d'erreur:
    Caused by: java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager:
    Exception Description: Error compiling the query [UPDATE Reservation e SET e.confirmation=:conf,e.chauffeur.numSom=:IdChau WHERE e.idResv = :id], line 1, column 48: invalid navigation expression [e.chauffeur], cannot navigate association field [chauffeur] in the SET clause target.
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1328)
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.createQuery(EntityManagerWrapper.java:425)
    at DAO.IDAO.ConfirmerReservation(IDAO.java:1182)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1056)
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1128)
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5292)
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:615)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:567)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:157)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:139)
    at sun.reflect.GeneratedMethodAccessor2532.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:858)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:367)
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5264)
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5252)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:190)
    ... 43 more
    Caused by: Exception [EclipseLink-8033] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.JPQLException
    Exception Description: Error compiling the query [UPDATE Reservation e SET e.confirmation=:conf,e.chauffeur.numSom=:IdChau WHERE e.idResv = :id], line 1, column 48: invalid navigation expression [e.chauffeur], cannot navigate association field [chauffeur] in the SET clause target.
    at org.eclipse.persistence.exceptions.JPQLException.invalidSetClauseNavigation(JPQLException.java:446)
    at org.eclipse.persistence.internal.jpa.parsing.EqualsAssignmentNode.validateNavigation(EqualsAssignmentNode.java:62)
    at org.eclipse.persistence.internal.jpa.parsing.EqualsAssignmentNode.validateTarget(EqualsAssignmentNode.java:44)
    at org.eclipse.persistence.internal.jpa.parsing.EqualsAssignmentNode.validate(EqualsAssignmentNode.java:31)
    at org.eclipse.persistence.internal.jpa.parsing.SetNode.validate(SetNode.java:67)
    at org.eclipse.persistence.internal.jpa.parsing.ParseTree.validate(ParseTree.java:208)
    at org.eclipse.persistence.internal.jpa.parsing.ParseTree.validate(ParseTree.java:187)
    at org.eclipse.persistence.internal.jpa.parsing.ParseTree.validate(ParseTree.java:177)
    at org.eclipse.persistence.internal.jpa.parsing.JPQLParseTree.populateModifyQueryInternal(JPQLParseTree.java:146)
    at org.eclipse.persistence.internal.jpa.parsing.JPQLParseTree.populateQuery(JPQLParseTree.java:88)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:202)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:173)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:125)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:109)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1326)
    ... 66 more
    Quelqu'un saurait-il m'expliquer d'où peut venir le problème ?

    Merci d'avance pour votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Bonjour,
    Peut on voir le code de la classe Chauffeur, juste pour vérifier le nom des attributs. Mais si on n'y trouve pas d'erreur, je résume un peu, en fait tu essaies de modifier 2 tables (2 entités) dans une seule requête c'est bien ça? si oui pourquoi ne ferais tu pas 2 update (une pour Chauffeur,suivie d'une autre pour Reservation)? même si je reconnais ça fait 2 accès bases? mais au moins c'est plus propre, visible et maintenable.

  3. #3
    Membre averti
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 45
    Par défaut
    Bonsoir;

    voilà le code de la classe chauffeur:
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    package JPA;
     
    import java.io.Serializable;
    import java.util.Date;
    import java.util.List;
    import javax.persistence.Basic;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.NamedQueries;
    import javax.persistence.NamedQuery;
    import javax.persistence.OneToMany;
    import javax.persistence.Table;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
     
     
     
     
    @Entity
    @Table(name = "chauffeur")
    @NamedQueries({
        @NamedQuery(name = "Chauffeur.findAll", query = "SELECT c FROM Chauffeur c"),
        @NamedQuery(name = "Chauffeur.findByNumSom", query = "SELECT c FROM Chauffeur c WHERE c.numSom = :numSom"),
        @NamedQuery(name = "Chauffeur.findByNom", query = "SELECT c FROM Chauffeur c WHERE c.nom = :nom"),
        @NamedQuery(name = "Chauffeur.findByPrenom", query = "SELECT c FROM Chauffeur c WHERE c.prenom = :prenom"),
        @NamedQuery(name = "Chauffeur.findByDateNaissance", query = "SELECT c FROM Chauffeur c WHERE c.dateNaissance = :dateNaissance"),
        @NamedQuery(name = "Chauffeur.findByLieuNaissance", query = "SELECT c FROM Chauffeur c WHERE c.lieuNaissance = :lieuNaissance"),
        @NamedQuery(name = "Chauffeur.findByAdresse", query = "SELECT c FROM Chauffeur c WHERE c.adresse = :adresse"),
        @NamedQuery(name = "Chauffeur.findByTele", query = "SELECT c FROM Chauffeur c WHERE c.tele = :tele"),
        @NamedQuery(name = "Chauffeur.findByEmail", query = "SELECT c FROM Chauffeur c WHERE c.email = :email")})
    public class Chauffeur implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @Basic(optional = false)
        @Column(name = "NUM_SOM")
        private Integer numSom;
        @Column(name = "NOM")
        private String nom;
        @Column(name = "PRENOM")
        private String prenom;
        @Column(name = "DATE_NAISSANCE")
        @Temporal(TemporalType.TIMESTAMP)
        private Date dateNaissance;
        @Column(name = "LIEU_NAISSANCE")
        private String lieuNaissance;
        @Column(name = "ADRESSE")
        private String adresse;
        @Column(name = "TELE")
        private String tele;
        @Column(name = "EMAIL")
        private String email;
        @OneToMany(mappedBy = "chauffeur")
        private List<Reservation> reservationList;
     
        public Chauffeur() {
        }
     
        public Chauffeur(Integer numSom) {
            this.numSom = numSom;
        }
     
        public Integer getNumSom() {
            return numSom;
        }
     
        public void setNumSom(Integer numSom) {
            this.numSom = numSom;
        }
     
        public String getNom() {
            return nom;
        }
     
        public void setNom(String nom) {
            this.nom = nom;
        }
     
        public String getPrenom() {
            return prenom;
        }
     
        public void setPrenom(String prenom) {
            this.prenom = prenom;
        }
     
        public Date getDateNaissance() {
            return dateNaissance;
        }
     
        public void setDateNaissance(Date dateNaissance) {
            this.dateNaissance = dateNaissance;
        }
     
        public String getLieuNaissance() {
            return lieuNaissance;
        }
     
        public void setLieuNaissance(String lieuNaissance) {
            this.lieuNaissance = lieuNaissance;
        }
     
        public String getAdresse() {
            return adresse;
        }
     
        public void setAdresse(String adresse) {
            this.adresse = adresse;
        }
     
        public String getTele() {
            return tele;
        }
     
        public void setTele(String tele) {
            this.tele = tele;
        }
     
        public String getEmail() {
            return email;
        }
     
        public void setEmail(String email) {
            this.email = email;
        }
     
        public List<Reservation> getReservationList() {
            return reservationList;
        }
     
        public void setReservationList(List<Reservation> reservationList) {
            this.reservationList = reservationList;
        }
     
        @Override
        public int hashCode() {
            int hash = 0;
            hash += (numSom != null ? numSom.hashCode() : 0);
            return hash;
        }
     
        @Override
        public boolean equals(Object object) {
            // TODO: Warning - this method won't work in the case the id fields are not set
            if (!(object instanceof Chauffeur)) {
                return false;
            }
            Chauffeur other = (Chauffeur) object;
            if ((this.numSom == null && other.numSom != null) || (this.numSom != null && !this.numSom.equals(other.numSom))) {
                return false;
            }
            return true;
        }
     
        @Override
        public String toString() {
            return "JPA.Chauffeur[numSom=" + numSom + "]";
        }
     
    }
    • j'explique:


    j'ai deux Acteur : "Administrateur" et "Client";
    Dans le premier cas, le client fait une réservation d'un véhicule sans déterminer le numéro SOM du chauffeur(valeur null)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     reservation.setChauffeur(null);
    Après, la demande à traiter par l'administrateur pour la confirmer, pour cela il faut spécifier le numéro SOM du chauffeur.

    j'ai créé la requête de modification,mais le message d'erreur toujours afficher.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Caused by: java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager:
    Exception Description: Error compiling the query [UPDATE Reservation e SET e.confirmation=:conf,e.chauffeur.numSom=:IdChau WHERE e.idResv = :id], line 1, column 48: invalid navigation expression [e.chauffeur], cannot navigate association field [chauffeur] in the SET clause target.

    je suis bloquée.

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Bonjour, je crois que j'ai compris ton souci. En fait NUM_SOM se trouve être la clé primaire de la classe Chauffeur. Hibernate ne doit pas aimer que tu lui forces ainsi dans une NamedQuery le changement d'une entité liée à une autre.Ce que je te propose c'est de ne pas passer par une NamedQuery, mais de procéder ainsi:
    1-Tu vas chercher via un findById le chauffeur en question en base.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Chauffeur chauffeurAAffecter = em.findById(idDuChauffeur);
    2-A ton entité Reservation rafraichie et pret à être créee en base tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Reservation reservationACreer.setChauffeur(chauffeurAAffecter );
    Et tu sauves. ça ça devrait marcher je pense

  5. #5
    Membre averti
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 45
    Par défaut
    merci Mr.DevServlet

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

Discussions similaires

  1. Modification de champs clés dans une entité avant la sauvegarde
    Par ThomasJJ dans le forum Entity Framework
    Réponses: 0
    Dernier message: 21/05/2010, 10h56
  2. Réponses: 3
    Dernier message: 04/05/2008, 12h30
  3. Modification de la valeur d'une variable session
    Par patrios dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 16/04/2008, 10h35
  4. Réponses: 2
    Dernier message: 04/03/2007, 16h59
  5. modification de la valeur d'une cellule
    Par magictom42 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 17/10/2006, 17h22

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