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

Persistance des données Java Discussion :

[ORM]Problème de conception


Sujet :

Persistance des données Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 584
    Par défaut [ORM]Problème de conception
    Bonjour,

    Au lancement de mon appli, je fais une requête pour renseigner mes objets. J'utilise JPA/EclipseLink.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	public List<Continent> findAllContinent() {
    		Query query = entityManager.createQuery("select c from "
    				+ Continent.class.getSimpleName() + " c order by c.continentName");
    		return query.getResultList();
    	}

    Par la suite, je fais une requête pour rechercher les continents qui commencent ou contiennent une chaine de caractère (ex: ri).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	public List<StationGrouping> findStationGroupingByName(String name) {
    		Query query = entityManager.createQuery("select sg from "
    				+ StationGrouping.class.getSimpleName() + " sg where LOWER(sg.stationGroupingName) like :name order by sg.stationGroupingName");
    		query.setParameter("name", "%" + name.toLowerCase()  +"%");
    		return query.getResultList();
    	}
    En faisant cela, je me retrouve avec plusieurs instance du même continent
    1ére requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Asie             org.worlddatabinding.domain.Continent@1127a1d8
    Amerique      org.worlddatabinding.domain.Continent@49c06a6d
    Afrique         org.worlddatabinding.domain.Continent@57125f92
    2ème requête (recherche des continents avec "ri" dans le nom)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Amérique      org.worlddatabinding.domain.Continent@40f274b4
    Afrique         org.worlddatabinding.domain.Continent@6dcbf6bb
    J'ai donc un problème de conception important

    Comment éviter d'avoir des instances du même objet ?
    Comment faire une recherche avec critères et synchroniser les données de la Bdd et celles du Domain ?

    D'avance merci pour votre aide

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 16
    Par défaut
    Bonjour,

    Pourquoi "Asie" est retourné dans la première requête?


    Par contre je ne comprends pas votre problème de conception?
    Les deux requêtes n'utilisent pas le même entityManager et donc les instances retournées comme résultat sont différentes. Par contre les deux requêtes doivent retourner des objets avec les même ids base de données. Non?

  3. #3
    Membre éclairé Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 584
    Par défaut
    Bonjoir

    Citation Envoyé par vhalalla Voir le message
    Pourquoi "Asie" est retourné dans la première requête?
    Asie est retourné car je fais un find de tous mes continents dans la base.
    ( findAllContinent() )

    Par contre je ne comprends pas votre problème de conception?
    Les deux requêtes n'utilisent pas le même entityManager et donc les instances retournées comme résultat sont différentes. Par contre les deux requêtes doivent retourner des objets avec les même ids base de données. Non?
    Oui les objets retournés ont le même ID mais j'ai deux instance différentes.
    Ce qui me pose problème par la suite.
    Sans rentrer dans le détails, j'ai un Tree représentant mes données.
    Pour le remplir je fais un findAllContinent().
    Je sélectionne un continent (ex:Asie) pour y ajouter un pays (enfant)
    Un wizard de création de Pays s'ouvre.
    Je me rend compte que le continent (parent) sélectionné à l'origine ne me convient pas. Je souhaite le modifier (ex:Amerique)et je fais donc une requête findContinentByName() pour avoir une liste limiter de continent à jour.

    J'ai donc 2 instances d'Amerique :
    • 1 dans le Tree -> récupérer via la 1ére requete
    • 1 utilisé dans le wizard de création de Pays -> 2ème requete


    Merci pour votre aide

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Par défaut
    Salut,
    J'aurais tendance à dire que si problème de conception il y a, il ne réside pas dans le fait d'avoir des instances différentes (c'est même obligatoire, si les instances étaient partagées tout le monde verrait les modifications faites sur les entités sans qu'elles aient été mergées). => Le problème réside plutôt dans le fait d'avoir besoin de la même instance.
    Si il y a besoin de comparer ces entités, il suffit de surcharger la méthode equals (ne pas comparer les références), peut-être hashCode (selon la méthode de comparaison), afin que les entités soient "égales" même si ce sont des instances différentes.

  5. #5
    Membre éclairé Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 584
    Par défaut
    Salut,

    Merci pour la réponse. Mon problème vient du fait que je fais du dataBinding avec JFace entre mon Tree et mes objets du domain.
    Mon tree comporte un instance des mes objets et lorsque je fais une seconde requête, je ne travail plus sur la même instance.... Donc mon Tree ne se met pas à jour. Le binding est brisé.

    Sinon, je pensais faire à chaque requête "find", une mise à jour de mes objets du domain. Mais je ne sais pas si c'est plus propre que de comparer mes objets

  6. #6
    Membre éclairé Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 584
    Par défaut
    Bonjour,

    Je tourne en rond sur ce sujet et je n'arrive pas à m'en sortir.

    Le fait de comparer mes entités du domain (détachées du contexte de persistance) et ceux de ma nouvelle requête de recherche ne m'avance guère
    Car je compare mes 2 instances et utilise mon entité (détachée) car c'est elle qui est liée avec mon Tree (dataBinding).

    Autant utiliser directement, les objets du domain sans faire de requête
    Mais cela ne me plait pas car, si un autre utilisateur ajoute un continent dans la bdd, je ne pourrai l'utiliser. Je perd aussi l'opportunité de faire des recherches "faciles" et "efficaces" type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Query query = entityManager.createQuery("select c from "
    				+ Continent.class.getSimpleName() + " c where LOWER(c.continentName) like :name ");
    		query.setParameter("name", "%" + name.toLowerCase()  +"%");
    D'avance merci

Discussions similaires

  1. Méthode Finalize et problème de conception
    Par phryos dans le forum Langage
    Réponses: 4
    Dernier message: 19/04/2006, 12h04
  2. [VB6][UserControl et OCX]Problème de conception
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 19/01/2006, 23h37
  3. Petit problème de conception sur access
    Par coooookinette dans le forum Modélisation
    Réponses: 3
    Dernier message: 18/12/2005, 19h24
  4. Gestion des départements problème de conception
    Par snoopy69 dans le forum Modélisation
    Réponses: 7
    Dernier message: 11/10/2005, 14h08
  5. Problème de conceptions de tables
    Par dtavan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/05/2004, 00h13

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