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 :

many-to-one bidirectionnelle méthode equals() stackoverflow


Sujet :

JPA Java

  1. #1
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    227
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 227
    Points : 109
    Points
    109
    Par défaut many-to-one bidirectionnelle méthode equals() stackoverflow
    Bonjours,

    J'ai une many-to-one bidirectionnelle entre employee et departement. J'ai une méthode equals() qui permet de tester l'égalité entre les employés et les département.
    Cette méthode est utilisée pour activer un bouton "Mettre à jour" qui teste si l'objet en mémoire n'a pas était modifié.

    Le problème est que la méthode equals() de employee appelle celle de département qui appelle celle de employee dans la méthode equals() de la liste des employés, ce qui l'élève une exception stackoverflow à cause de la boucle infinie. Quelqu'un à une idée de la manière de contourner cette boucle infinie?

    Departement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        @NotNull
        @Size(max = 250)
        @Column(name = "description")
        private String description;
        @OneToMany(mappedBy = "department", cascade = CascadeType.MERGE)
        private List<Employee> employeeList;
    Department equals():
    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
     
        @Override
        public boolean equals(Object obj) {
            if (obj == null) {
                return false;
            }
            if (getClass() != obj.getClass()) {
                return false;
            }
            final Department other = (Department) obj;
     
            if (!Objects.equals(this.name, other.name)) {
                return false;
            }
            if (!Objects.equals(this.description, other.description)) {
                return false;
            }
            if (!Objects.equals(this.employeeList, other.employeeList)) {
                return false;
            }

    Employee:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        @JoinColumn(name = "id_department", referencedColumnName = "id_department")
        @ManyToOne(fetch = FetchType.EAGER)
        private Department department;
    Employee equals():
    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
     
        @Override
        public boolean equals(Object obj) {
            if (obj == null) {
                return false;
            }
            if (getClass() != obj.getClass()) {
                return false;
            }
            final Employee other = (Employee) obj;
            if (!Objects.equals(this.begincontract, other.begincontract)) {
                return false;
            }
            if (!Objects.equals(this.department, other.department)) {
                return false;
            }

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    Par défaut
    En dehors du problème du stackoverflow, n'oubliez pas que equals() sur des listes signifie dixit la doc : "two lists are defined to be equal if they contain the same elements in the same order."
    Étant donné que vous n'avez pas de OrderBy sur vos relations, l'ordre des objets dans la liste dépendra du "bon vouloir" du SGBD…
    Donc, ou vous utilisez OrderBy ou vous mappez sur des Set<>.

    Pour le stackoverflow, il est évident que vous ne pouvez pas utiliser equals() : vous devez écrire votre propre mécanisme de comparaison qui comparera les @Id (+ le @Version si vous faites de l'optimistic lock) ou si les 2 @Id sont null il faudra vous rabattre sur les valeurs "business" des @Entity.

    Suivant l'ORM sous-jacent, vous pourrez utiliser son mécanisme propre pour connaître la valeur de @Id sans faire de round-trip à la DB, par exemple avec Hibernate en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		if (entity instanceof HibernateProxy) {
    			return ((HibernateProxy) entity).getHibernateLazyInitializer().getIdentifier();
    		}

  3. #3
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    227
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 227
    Points : 109
    Points
    109
    Par défaut
    Concernant le premier paragraphe, les deux objets seront toujours identiques dans un premier temps, parce que le second objet est une copie du premier et permet par l'égalité de vérifier quand il y a un changement et de revenir dans l'état initial de l'objet dans le cas échéant.
    La méthode equals() n'est peut être pas le bon endroit pour tester ce genre de scénario, je vais essayer de creuser ailleurs.

    Merci de ton coup de main.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/12/2008, 11h57
  2. [Hibernate]POJO et many-to-one
    Par azpublic dans le forum Hibernate
    Réponses: 3
    Dernier message: 13/07/2006, 15h00
  3. html:select et hibernate many-to-one
    Par davdou dans le forum Struts 1
    Réponses: 1
    Dernier message: 05/07/2006, 14h56
  4. Hibernate : suppression sur relation many to one
    Par taf dans le forum Hibernate
    Réponses: 1
    Dernier message: 23/05/2006, 13h08
  5. [hibernate] "many-to-one"
    Par mehdi_swatch dans le forum Hibernate
    Réponses: 26
    Dernier message: 12/05/2006, 20h11

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