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 merge et id


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 138
    Par défaut Problème de merge et id
    Bonjour,

    j'ai une entité Sport comme ci-dessous :
    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
     
    @Entity
    @Table(name = "sport")
    @XmlRootElement
    public class Sport implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "IDSport")
        private Integer iDSport;
        @Column(name = "NomSport",length=20)
        private String nomSport;
        @Column(name = "ImgSport",length=50)
        private String imgSport;
     
        @OneToMany()
        @JoinColumn(name="IDSport", referencedColumnName="IDSport")
        private List<Sportsaison> sportSaisons;
     
        public Sport() {
        }
     
        public Sport(Integer iDSport) {
            this.iDSport = iDSport;
        }
     
        public Integer getIDSport() {
            return iDSport;
        }
     
        public void setIDSport(Integer iDSport) {
            this.iDSport = iDSport;
        }
     
        public String getNomSport() {
            return nomSport;
        }
     
        public void setNomSport(String nomSport) {
            this.nomSport = nomSport;
        }
     
        public String getImgSport() {
            return imgSport;
        }
     
        public void setImgSport(String imgSport) {
            this.imgSport = imgSport;
        }
     
        @XmlTransient
        public List<Sportsaison> getSportSaisons() {
            return sportSaisons;
        }
     
        public void setSportSaisons(List<Sportsaison> sportSaisons) {
            this.sportSaisons = sportSaisons;
        }
     
        @Override
        public int hashCode() {
            int hash = 0;
            hash += (iDSport != null ? iDSport.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 Sport)) {
                return false;
            }
            Sport other = (Sport) object;
            if ((this.iDSport == null && other.iDSport != null) || (this.iDSport != null && !this.iDSport.equals(other.iDSport))) {
                return false;
            }
            return true;
        }
     
        @Override
        public String toString() {
            return "ch.plugin.sportreserv.entity.Sport[ iDSport=" + iDSport + " ]";
        }
     
    }
    dans mon DAO, je veux modifier le nom et ensuite mettre à jour avec un em.merge(sport).

    Mais comme ce sport est déjà lié à un sport saison, il me fait cette erreur :
    INFO: Hibernate:
    /* delete one-to-many ch.plugin.sportreserv.entity.Sport.sportSaisons */ update
    sportsaison
    set
    IDSport=null
    where
    IDSport=?
    ATTENTION: SQL Error: 1048, SQLState: 23000
    GRAVE: Column 'IDSport' cannot be null
    GRAVE: Could not synchronize database state with session
    Mais je ne comprends pas pourquoi il va me supprimer la relation et l'élément qui existe déjà dans l'entité sportSaison ! Il doit être impossible de modifier un ID non ?

    Pourquoi il me fait cette requête ?

    Merci de votre aide

  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
    Lisez le message d'erreur correctement : c'est IDSport de SportSaison qu'il essaie de mettre à null pas IDSport de Sport.
    (et donc le problème est relatif à ce vous faites de List<Sportsaison> sportSaisosn dans votre code…)

    Ce genre d'erreur d'interprétation des messages n'arriveraient si vous vous imposiez une discipline dans votre manière de nommer les champs… appeler la PK et la FK du même nom (IDSport) ne peut qu'amener des confusions.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 138
    Par défaut
    Ca je l'avais bien compris que c'était dans sportSaison que l' IDSport était supprimé.

    Mais comme l'ID de sportSaison c'est IDSport et IDSaison et que l'ID de sport c'est IDSport, il ne devrait jamais essayer de les supprimer non ? et encore moins de les modifier....

    Pourquoi quand je fais un em.merge(sport), il va me supprimer l'IDSport de sportSaison ? Et comment faire pour qu'il ne me fasse pas ça ?

  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 chatis Voir le message
    Ca je l'avais bien compris que c'était dans sportSaison que l' IDSport était supprimé.

    Mais comme l'ID de sportSaison c'est IDSport et IDSaison et que l'ID de sport c'est IDSport, il ne devrait jamais essayer de les supprimer non ? et encore moins de les modifier....

    Pourquoi quand je fais un em.merge(sport), il va me supprimer l'IDSport de sportSaison ? Et comment faire pour qu'il ne me fasse pas ça ?
    "le problème est relatif à ce vous faites de List<Sportsaison> sportSaisons dans votre code…"

    Mettre à NULL la FK dans Sportsaison est sans doute induit par le fait que "List<Sportsaison> sportSaisons" est maintenant une liste vide et donc qu'il faut s'assurer que les potentiels "anciens" membres de la liste ne soient plus reliées à leur "Sport",
    qu'il y en ait ou pas, pour un ORM, il est plus rapide de faire un seul "update … set … NULL" que de tester s'il y en avait et de faire l'update uniquement après avoir tester une éventuelle présence d'anciens Sportsaison lié à l'instance de Sport.

    Ceci est dû au fait que vous ne spécifiez rien quant au mode de cascading à appliquer dans la relation @OneToMany ni dans son inverse (donc l'ORM applique son comportement par défaut), et il est probable que ce que vous désirez en fait implique un "deleteOrphans" (càd que les anciens Sportsaison qui n'appartiennent plus à un Sport doivent être supprimés par un "delete" et non détachés du Sport par un "update" qui entre en conflit avec vos contraintes).

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 138
    Par défaut
    OK je vois... car effectivement l'objet Sport que je renvoie de l'interface contient seulement les éléments nom image et id. Les autres ne sont pas mentionner. Donc il interprète que j'ai supprimé les liaisons avec sportSaison ! D'où la suppression !! Merci je vais tester cela demain et je vous tiens au courant ! Mais je pense qu'avant que je fasse le em.merge(), il faut que je fasse un sport.getsortSaison() ou quelque chose comme ca.

    Je vais tester...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 138
    Par défaut
    YEAH CA MARCHE !! Merci beaucoup !!

    Voilà la ligne que j'ai rajouté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sport.setSportSaisons(this.find(sport.getIDSport()).getSportSaisons());

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

Discussions similaires

  1. Problème avec Merge
    Par Thomad dans le forum PL/SQL
    Réponses: 1
    Dernier message: 16/07/2008, 22h11
  2. Problème Intruction MERGE
    Par ttamttam dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 08/06/2008, 14h56
  3. [Utilisation] Problème de merge
    Par goetzilla dans le forum Subversion
    Réponses: 2
    Dernier message: 11/01/2008, 19h17
  4. 9i : problème avec MERGE INTO
    Par Vld44 dans le forum SQL
    Réponses: 1
    Dernier message: 16/08/2007, 11h27
  5. Problème de MERGE
    Par cyrille_ dans le forum SQL
    Réponses: 20
    Dernier message: 15/06/2007, 12h19

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