Re: [Cantharella-devel] Méthode equals() et hashCode() non redéfinie sur les entités
Le 28/02/2013 20:47, Eric Chatellier a écrit :
à moins que tu préfères charger ton objet dans la même session Hibernate que ta liste. C'est un document qui n'a pas forcement d'id (par encore sauvé), donc actuellement je n'ai que l'instance non rechargeable. Ok, je comprends mieux la subtilité. Tu ne peux pas utiliser un constructeur qui prend en argument un id et qui charge l'objet car celui-ci peut ne pas exister. Cela se passe uniquement quand on crée une entité quelconque puis qu'on ajoute un document et qu'on revient sur son édition avant d'avoir valider l'entité créer. Ce n'est qu'à la validation du formulaire de cet entité que l'ensemble des objets sont enregistrés en base. Par contre, ce que je ne saisis pas tout à fait, c'est que tu sembles effectuer l'ajout du fichier en base lorsqu'on valide l'ajout d'un document. Cette ajout ne devrait-il pas se faire qu'une fois l'entité enregistré pour éviter de laisser des fichiers orphelins ?? (exemple du cas où l'utilisateur ajoute des documents puis annule ensuite l'ajout de l'entité). Non, je fais seulement : documentAttachable.addDocument(document); La sauvegarde en base ne se fait que quand le "documentAttachable" sera sauvegardé plus tard.
À ne pas confondre avec: documentService.addDocumentContent(document, uploadedFile.getClientFileName(), uploadedFile .getContentType(), uploadedFile.getBytes()); qui fait du traitement d'image pour générer la miniature de l'image mais qui ne sauvegarde rien.
Oui, c'est bien la méthode qui m'a induit en erreur. Tu as raison le contenu du document est juste ajouté, et ce n'est qu'à la validation de l'entité qu'on a bien un save() qui en cascade sauvegarde bien le document en base. C'est une très bonne chose d'avoir fait le choix de sauvegarder les fichiers en base, cela simplifie grandement leur gestion !
Je trouve que ce code à plus sa place dans les services que c'est l'UI. Tout à fait.
Cela me fait penser qu'il faudrait prévenir l'utilisateur au retour de formulaire d'édition du document par un simple avertissement du style : "L'enregistrement du document s'effectuera à la validation du formulaire". Je modifie le OK message dans ce sens. Parfait, ça sera plus clair pour l'utilisateur.
Bon week-end, Adrien -- Adrien Cheype Ingénieur en Systèmes d'Information Service « Informatique Scientifique et Appui aux Partenaires du Sud » Direction du Système d'Information (DSI) http://www.ird.fr/dsi/ http://www.ird.fr/informatique-scientifique/ INSTITUT DE RECHERCHE POUR LE DEVELOPPEMENT BP A5 - 98848 Nouméa - Nouvelle Calédonie Tél. +687 260 789
Le 01/03/2013 06:00, Adrien Cheype a écrit : Concernant le bug : http://forge.codelutin.com/issues/2362 c'est encore un problème de equals/hashCode. Mais dans ce cas, il est encore plus compliqué. Je force le rechargement de l'utilisateur et de la molécule dans la même session: - Utilisateur utilisateur = getSession().getUtilisateur(); - List<MoleculeProvenance> moleculeProvenances = moleculeModel.getObject().getProvenances(); Les lots sur lesquel l'utilisateur à les droits: - utilisateur.getLotsDroits() et le lot sur lequel porte la molécule: - moleculeProvenances.getProduit().getExtraction().getLot() sont a chaque fois des instances différentes et le - utilisateur.getLotsDroits().containsKey(lot) ne pourra jamais fonctionner. Je creuse encore pour savoir pouquoi elles sont différentes, mais c'est très compliqué. -- Éric Chatellier - Code Lutin Tel: 02.40.50.29.28 - http://www.codelutin.com
Bonjour, Je n'ai pas eu le temps de regarder cela de près mais j'ai du mal à comprendre pourquoi le bug ne se produit alors qu'avec un utilisateur non administrateur... Peux-tu me donner le numéros de ligne ou les comparaisons (implicites) et chargements s'effectuent ? Bien que j'aurai peu de temps, j'essaierai d'y jeter un oeil. Adrien Le 27/04/2013 02:27, Eric Chatellier a écrit :
Le 01/03/2013 06:00, Adrien Cheype a écrit :
Concernant le bug : http://forge.codelutin.com/issues/2362 c'est encore un problème de equals/hashCode.
Mais dans ce cas, il est encore plus compliqué. Je force le rechargement de l'utilisateur et de la molécule dans la même session: - Utilisateur utilisateur = getSession().getUtilisateur(); - List<MoleculeProvenance> moleculeProvenances = moleculeModel.getObject().getProvenances();
Les lots sur lesquel l'utilisateur à les droits: - utilisateur.getLotsDroits() et le lot sur lequel porte la molécule: - moleculeProvenances.getProduit().getExtraction().getLot()
sont a chaque fois des instances différentes et le - utilisateur.getLotsDroits().containsKey(lot) ne pourra jamais fonctionner.
Je creuse encore pour savoir pouquoi elles sont différentes, mais c'est très compliqué.
-- Adrien Cheype Ingénieur en Systèmes d'Information Service « Informatique Scientifique et Appui aux Partenaires du Sud » Direction du Système d'Information (DSI) http://www.ird.fr/dsi/ http://www.ird.fr/informatique-scientifique/ INSTITUT DE RECHERCHE POUR LE DEVELOPPEMENT BP A5 - 98848 Nouméa - Nouvelle Calédonie Tél. +687 260 789
Le 29/04/2013 10:44, Adrien Cheype a écrit :
Bonjour,
Je n'ai pas eu le temps de regarder cela de près mais j'ai du mal à comprendre pourquoi le bug ne se produit alors qu'avec un utilisateur non administrateur... Les droits ne sont pas vérifié pour l'admin: http://forge.codelutin.com/projects/cantharella/repository/entry/trunk/canth... Peux-tu me donner le numéros de ligne ou les comparaisons (implicites) et chargements s'effectuent ? Bien que j'aurai peu de temps, j'essaierai d'y jeter un oeil. Le chargement est ici: http://forge.codelutin.com/projects/cantharella/repository/entry/trunk/canth... et la gestion des droits: http://forge.codelutin.com/projects/cantharella/repository/entry/trunk/canth...
-- Éric Chatellier - Code Lutin Tel: 02.40.50.29.28 - http://www.codelutin.com
Salut Eric, J'ai remonté comme toi la trace d'exécution et ai également bien constaté qu'à la fois la molécule (et par conséquent MoleculeProvenance) et l'utilisateur (et par conséquent CampagneDroits pour cet exemple) étaient bien chargés dans la même session. Je suis autant étonné que toi de voir qu'hibernate charge alors distinctement deux objets différents pour les mêmes campagnes. Il doit y avoir quelque chose qui nous échappe, il faudrait regarder davantage ce qui se passe dans les logs d'Hibernate. J'ai trouvé une correction toutefois assez simple dans la vérification des droits en utilisant un containsWithValue qui se base sur idCampagne plutôt qu'un contains. Cela donne pour les campagnesDroits (faire de même pour les campagnesCrees, campagnesDroits et lotsDroits) :
// accessible si l'utilisateur a le droit à la campagne if (CollectionTools.containsWithValue(utilisateur.getCampagnesDroits().keySet(), "idCampagne", BeanTools.AccessType.GETTER, lot.getCampagne().getIdCampagne())) { return true; } Il faudrait vérifier également plus haut que lot.getCreateur() est bien chargé dans le même objet qu'utilisateur...
Si tu trouves pourquoi les objects ne sont pas chargés dans la même instance, mieux vaut toutefois garder le code initial : il sera plus performant. Adrien Le 29/04/2013 20:59, Eric Chatellier a écrit :
Le 29/04/2013 10:44, Adrien Cheype a écrit :
Bonjour,
Je n'ai pas eu le temps de regarder cela de près mais j'ai du mal à comprendre pourquoi le bug ne se produit alors qu'avec un utilisateur non administrateur... Les droits ne sont pas vérifié pour l'admin: http://forge.codelutin.com/projects/cantharella/repository/entry/trunk/canth... Peux-tu me donner le numéros de ligne ou les comparaisons (implicites) et chargements s'effectuent ? Bien que j'aurai peu de temps, j'essaierai d'y jeter un oeil. Le chargement est ici: http://forge.codelutin.com/projects/cantharella/repository/entry/trunk/canth... et la gestion des droits: http://forge.codelutin.com/projects/cantharella/repository/entry/trunk/canth...
-- Adrien Cheype Ingénieur en Systèmes d'Information Service « Informatique Scientifique et Appui aux Partenaires du Sud » Direction du Système d'Information (DSI) http://www.ird.fr/dsi/ http://www.ird.fr/informatique-scientifique/ INSTITUT DE RECHERCHE POUR LE DEVELOPPEMENT BP A5 - 98848 Nouméa - Nouvelle Calédonie Tél. +687 260 789
Le 30/04/2013 08:14, Adrien Cheype a écrit :
J'ai trouvé une correction toutefois assez simple dans la vérification des droits en utilisant un containsWithValue qui se base sur idCampagne plutôt qu'un contains. Cela donne pour les campagnesDroits (faire de même pour les campagnesCrees, campagnesDroits et lotsDroits) :
// accessible si l'utilisateur a le droit à la campagne if (CollectionTools.containsWithValue(utilisateur.getCampagnesDroits().keySet(), "idCampagne", BeanTools.AccessType.GETTER, lot.getCampagne().getIdCampagne())) { return true; } Il faudrait vérifier également plus haut que lot.getCreateur() est bien chargé dans le même objet qu'utilisateur...
Je vais commité ca pour l'instant avec un commentaire explicatif.
Si tu trouves pourquoi les objects ne sont pas chargés dans la même instance, mieux vaut toutefois garder le code initial : il sera plus performant.
Si je lit bien cette page: https://community.jboss.org/wiki/EqualsAndHashCode les eq/hc ont l'air d'avoir une importance supplémentaire sur les entités sont utilisées comme clé composite, ce qui est le cas pour la gestion des droits. -- Éric Chatellier - Code Lutin Tel: 02.40.50.29.28 - http://www.codelutin.com
Si je lit bien cette page: https://community.jboss.org/wiki/EqualsAndHashCode les eq/hc ont l'air d'avoir une importance supplémentaire sur les entités sont utilisées comme clé composite, ce qui est le cas pour la gestion des droits. Oui, d'ailleurs tu peux constater que les entités qui ont une clé composite sont les seules qui ont leur hashcode() et equals() de défini !
Le 03/05/2013 01:32, Adrien Cheype a écrit :
Si je lit bien cette page: https://community.jboss.org/wiki/EqualsAndHashCode les eq/hc ont l'air d'avoir une importance supplémentaire sur les entités sont utilisées comme clé composite, ce qui est le cas pour la gestion des droits. Oui, d'ailleurs tu peux constater que les entités qui ont une clé composite sont les seules qui ont leur hashcode() et equals() de défini !
A relire en effet. Je pensait que c'était les composantes d'une clé composite qui devait en avoir également. -- Éric Chatellier - Code Lutin Tel: 02.40.50.29.28 - http://www.codelutin.com
participants (2)
-
Adrien Cheype -
Eric Chatellier