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 :

Mapping de map un peu complexe


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Par défaut Mapping de map un peu complexe
    Bonjour.

    J'ai trois objets : Table, Objectif, Projet et trois tables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Table ( id, nom, ...)
    Objectif (id, #idTable=>Table.id, #idProjet=>Projet.id, ...)
    Projet (id, nomProjet, ...)
    Un objectif est associé à une table.
    Un objectif n'appartient qu'a un seul projet.
    Un projet n'a qu'un objectif par table.

    Et dans la classe projet j'ai donc tout logiquement :
    Map<Table, Objectif>

    Je ne vois pas comment faire le mapping vu que en java c'est Projet->Objectif et en BDD : Objectif->Java

    Avez-vous des idées ?

    Merci d'avance.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Par défaut
    Hello,

    Peut-être je comprend mal ton problème mais je ne pense pas que tu doives définir une Map dans ton Projet.

    J'ai l'impression que ceci est la conception (faut rajouter les getters & setters) liée à ton problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class Table {
    	long id;
    	String nom;
    	Set<Objectif> objectifs;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class Projet {
    	long id;
    	String nomProjet;
    	Set<Objectif> objectifs;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class Objectif {
    	private long id;
    	private Table table;
    	private Projet projet;
    }

  3. #3
    Membre confirmé
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Par défaut
    Merci pour cette réponse.

    En fait, au niveau de la conception, je considère qu'une table n'a pas à connaître d'objectifs. Elle ne connaît personne en fait, elle est autonome.

    (En gros, le but de l'application est de compter le nombre d'enregistrements pour chaque table qui vont être réalisés dans le cadre d'un projet)

    D'une manière théorique pure j'ai l'association suivante :
    Le projet connait tous ses objectifs, chaque objectif est associé à une table.

    D'un point de vue pratique, j'ai besoin à partir du nom d'une table de retrouver l'objectif associé à cette table dans le cadre d'un projet.
    Donc plutôt que de faire un
    Iterator<Objectif> it = objectifs.iterator();
    boolean trouve = false;
    while (it.hasNext() && !trouve)
    {
    unObjectif = it.next();
    if (unObjectif.getTable() == maTableQueJeRecherche) trouve=true;
    }
    J'ai construit une map<Table, Objectif>
    et hop un maMap.get(Table) et c'est torché.

    D'après ce que j'ai pu lire sur hibernate et co. mes objets metiers ne doivent pas être dépendant de la couche de persistance. Donc j'ai tout fait en pojo et là je regarde comment je peux connecter tout ça à hibernate (et c'est vraiment pas facile :/ )

    J'ai envie de dire qu'intuitivement un criteria ferait bien l'affaire mais ça mélangerais la logique metier avec la persistance.

    Après, peut être que la map n'est pas appropriée pour ce que je veux faire ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Par défaut
    En réfléchissant bien, je me rends compte que cette map n'a pas d'équivalent dans ma bdd.
    C'est cette distance entre ma "commodité" java et le modèle relationnelle qui pose problème.

    A part la moche boucle while je vois pas vraiment comment faire.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Par défaut
    Si ta cardinalité est la suivante :
    Table (0-n) - (1-1) Objectif
    Projet (0-n) - (1-1) Objectif

    Le modèle que je te soumet devrait être ok.

    Les fichiers de mapping te mèneront à avoir 3 tables. Et la table Objectif aura 2 clés étrangères (1 vers Table et 1 vers Projet).

    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
     
    tables` (
      `id` bigint(20) NOT NULL auto_increment,
      `nom` varchar(255) default NULL,
      PRIMARY KEY  (`id`)
    )
     
    `projets` (
      `id` bigint(20) NOT NULL auto_increment,
      `nomProjet` varchar(255) default NULL,
      PRIMARY KEY  (`id`)
    )
     
    `objectifs` (
      `id` bigint(20) NOT NULL auto_increment,
      `table_id` bigint(20) default NULL,
      `projet_id` bigint(20) default NULL,
      PRIMARY KEY  (`id`),
      KEY `FK4D4EC737606F1336` (`projet_id`),
      KEY `FK4D4EC737F0AE427E` (`table_id`)
    )
    Après, si tu dois obtenir objectif pour une table et un projet tu peux le faire de plusieurs manière :
    1 - Tu récupère une table sur base de son nom, tu parcours les objectifs pour lesquels tu récupères le projet et tu fais un test sur celui-ci

    2 - En SQL ou HQL, tu fais une requête jointe dont l'équivalent sql serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select ... from objectifs, tables, projets 
    where 
    objectifs.table_id=tables.id 
    and 
    objectifs.projet_id=projets.id
    and tables.name="xxx"
    and projets.name="yyy"

  6. #6
    Membre confirmé
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Par défaut
    Oui, je suis ok avec le schéma (qui est celui de mon premier post).

    Ce qui me gène maintenant, c'est dans l'implémentation de projet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Objectif projet.getObjectif(Table t)
    {
      if (t == null) throw....
      return mapObjectifsParTable.get(t);
    }
    va devenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Objectif projet.getObjectif(Table t)
    {
      if (t == null) throw
      //ta requete sql
    }
    Ce qui veux dire que projet est lié à hibernate, ce qui à ce que j'ai compris n'est pas très propre. Ou alors j'ai mal compris

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

Discussions similaires

  1. Gérer un Formulaire un peu complexe pour moi
    Par budylove dans le forum Langage
    Réponses: 3
    Dernier message: 17/05/2006, 10h01
  2. Un Alignement un peu complexe
    Par Jeskor dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 27/04/2006, 17h04
  3. Réponses: 4
    Dernier message: 02/03/2006, 20h40
  4. Requête de sélection un peu complexe
    Par new_wave dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 03/01/2006, 14h44
  5. Requete un peu complexe avec la fonction IN
    Par Taichin dans le forum Oracle
    Réponses: 27
    Dernier message: 10/11/2004, 08h59

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