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

Hibernate Java Discussion :

classe Id doit surcharger equals()


Sujet :

Hibernate Java

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 18
    Par défaut classe Id doit surcharger equals()
    Bonjour.

    J'ai une entité EntityBudyPhone qui définit une table d'association many-to-many entre Phone et Budy.
    (une personne peut avoir plusieurs téléphones, mais on peut aussi joindre plusieurs personnes en appelant un seul numéro)

    Voici ma classe :

    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
    package org.gfarny.ejb3;
     
    import java.io.Serializable;
     
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Embeddable;
    import javax.persistence.EmbeddedId;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    import javax.persistence.OneToOne;
    import javax.persistence.Table;
    import javax.persistence.UniqueConstraint;
    import javax.ejb.CreateException;
     
    @Entity
    @Table(name="phone_rel_bud", uniqueConstraints = @UniqueConstraint(columnNames = {"phone_fk","budy_fk"}))
    public class EntityBudyPhone implements Serializable {
     
    	private static final long serialVersionUID = 4037447988458724371L;
     
    	@Embeddable
    	public static class Id implements Serializable {
    		private static final long serialVersionUID = -9040939392333356524L;
     
    		@Column(name="budy_fk", nullable=false)
    		private int budyFk = 0;
     
    		@Column(name="phone_fk", nullable=false)
    		private int phoneFk = 0;
     
    		public void setBudyFk(int b) {
    			this.budyFk = b;
    		}
     
    		public int getBudyFk() {
    			return budyFk;
    		}
     
    		public void setPhoneFk(int p) {
    			this.phoneFk = p;
    		}
     
    		public int getPhoneFk() {
    			return phoneFk;
    		}
     
    		Id() {}
     
    		Id(int budyFk, int phoneFk) {
    			setBudyFk(budyFk);
    			setPhoneFk(phoneFk);
    		}
     
    		public String toString() {
    			return String.format("EntityBudyPhone[%d,%d]", getBudyFk(), getPhoneFk());
    		}
     
    		public int hashCode() {
    			return this.toString().hashCode();
    		}
     
    		public boolean equals(Id i) {
    			if (this.budyFk == i.getBudyFk())
    				if (this.phoneFk == i.getPhoneFk())
    					return true;
    			return false;
    		}
    	}
     
    	@EmbeddedId
    	private Id id;
     
    	// JPA ne doit pas gérer cette clé étrangère (insertable = false, updatable = false)
    	@ManyToOne
    	@JoinColumn(name="budy_fk", insertable=false, updatable=false, nullable=false)
    	private EntityBudy entityBudy;
     
    	// JPA ne doit pas gérer cette clé étrangère (insertable = false, updatable = false)
    	@ManyToOne
    	@JoinColumn(name="phone_fk", insertable=false, updatable=false, nullable=false)
    	private EntityPhone entityPhone;
     
    	public Id getId() {
    		return id;
    	}
     
    	public void setEntityBudy(EntityBudy eb) {
    		entityBudy = eb;
    	}
     
    	public EntityBudy getEntityBudy() {
    		return entityBudy;
    	}
     
    	public void setEntityPhone(EntityPhone ep) {
    		entityPhone = ep;
    	}
     
    	public EntityPhone getEntityPhone() {
    		return entityPhone;
    	}
     
    	public EntityBudyPhone() {}
     
    	public EntityBudyPhone(EntityBudy eb, EntityPhone ep) {
    		id = new Id(eb.getId(), ep.getId());
    		setEntityBudy(eb);
    		setEntityPhone(ep);
    		eb.getEntityBudyPhoneSet().add(this);
    		ep.getEntityBudyPhoneSet().add(this);
    	}
     
    	public boolean equals (EntityBudyPhone ebp) {
    		if (this.id.equals(ebp.getId()))
    				return true;
    		return false;
    	}
    }
    Lorsque je déploie, Hibernate prétend que :

    Code console : Sélectionner tout - Visualiser dans une fenêtre à part
    12:21:14,642 WARN  [org.hibernate.mapping.RootClass] (ServerService Thread Pool -- 79) HHH000038: Composite-id class does not override equals(): org.gfarny.ejb3.EntityBudyPhone$Id

    Ma méthode equals() est bien présente. "Override", voilà le problème. Quelle superclasse ma classe imbriquée Id{} devrait-elle surcharger / étendre ?


    Merci.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ceci est un problème de Java en général. Regarde la définition de la méthode equals() dans la documentation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public boolean equals(Object obj)
    Toi, tu as écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public boolean equals (EntityBudyPhone ebp) {
    Tu as donc créé une nouvelle méthode (signature différente), donc surchargé (overload), mais pas redéfini (override).

    Si on essaye de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    EntityBudyPhone enityBudyPhone = ...
    Object unObject = ... // ici on pourrait mettre n'importe quelle classe au lieu de Object, sauf EntityBudyPhone et les classes qui l'étendent, que ça ferait toujours l'appel à Object.equals(Object).
    boolean estEgal = tonObject.equals(unObject);
    Ta méthode ne sera pas appelée : Java sélectionnera celle dont la signature correspond au type qu'il connait donc celle de la classe Object.

    Pour être sûr de ne pas manquer ça à la compilation, tu peux ajouter l'annotation @override.

    Pour résoudre ton problème, il te suffit d'ajouter, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @Override
    public boolean equals(Object object) {
        if( object instanceof EntityBudyPhone ) {
               return equals((EntityBudyPhone)object);
        }
        return false;
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Même chose dans ta interne ID

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    		public boolean equals(Id i) {
    			if (this.budyFk == i.getBudyFk())
    				if (this.phoneFk == i.getPhoneFk())
    					return true;
    			return false;
    		}
    A transformer en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    		public boolean equals(Object o) {
                            if (o instanceof Id){
    				Id i = (Id) o;
    				if (this.budyFk == i.getBudyFk() && 
    					this.phoneFk == i.getPhoneFk()){
    					return true;
    				}
    			}
    			return false;
    		}

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 18
    Par défaut C'était donc Object.equals() merci !
    C'était donc Object.equals(Object) qu'il fallait redéfinir !
    Merci !
    Problème résolu.

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

Discussions similaires

  1. Problème surcharge equals
    Par gwinyam dans le forum Langage
    Réponses: 3
    Dernier message: 04/07/2008, 13h41
  2. souci classe template et surcharge operateur
    Par loicounet dans le forum Langage
    Réponses: 8
    Dernier message: 28/04/2008, 15h01
  3. [POO] Classe mère/fille surcharge
    Par shadeoner dans le forum Langage
    Réponses: 5
    Dernier message: 31/01/2008, 01h36
  4. Réponses: 6
    Dernier message: 20/03/2007, 10h51

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