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 :

[Hibernate] Comment ramener les valeurs des tables de ref ?


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 76
    Points : 49
    Points
    49
    Par défaut [Hibernate] Comment ramener les valeurs des tables de ref ?
    Bonjour,

    Je travaille avec eclipse3.1 ,mysql 5.1 et hibernate3.
    Je me pose une question de conception.
    J'ai deux types de tables en BDD :
    - tables de données, qui contiennent les clés des données.
    - tables de référence, qui contiennent les libellés de ces clés.

    Par exemple, la table de données CHAT, possède le champ ID_COULEUR=3, et la table COULEURS, contient la valeur correspondante :
    COULEUR_ID = 3; NOM_COULEUR="GRIS".

    Je m'interroge sur la nécessité de créer un nouvel objet CHAT, différent de celui généré par hibernate, qui contiendrait en plus des champs mappant la table CHAT en base, tous ces libellés.
    Cela ne pose t'il pas de problème à Hibernate ensuite ? (le mapping n'étant plus totalement respecté).
    Quelles sont les best practices ?
    Merci.

  2. #2
    Membre habitué
    Inscrit en
    Septembre 2003
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 174
    Points : 194
    Points
    194
    Par défaut Re: [Hibernate] Comment ramener les valeurs des tables de re
    Salut,
    Citation Envoyé par PamelaGeek
    Je m'interroge sur la nécessité de créer un nouvel objet CHAT, différent de celui généré par hibernate, qui contiendrait en plus des champs mappant la table CHAT en base, tous ces libellés.
    Cela ne pose t'il pas de problème à Hibernate ensuite ? (le mapping n'étant plus totalement respecté).
    Quelles sont les best practices ?
    Je ne suis pas sur de comprendre ton problème ... en particulier qu'est ce que "l'objet généré par hibernate" ?
    A priori, il s'agit d'un cas de mapping tout à fait basique, et tu aurais donc (à moins que je n'ai pas saisi la subtilité) :

    - La classe Chat
    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
    public class Chat {
    	private Long id;
    	private Couleur couleur;
     
    	public Chat(){
     
    	}
     
    	/**
             * @return Returns the couleur.
             */
    	public Couleur getCouleur() {
    		return couleur;
    	}
     
    	/**
             * @param couleur The couleur to set.
             */
    	public void setCouleur(Couleur couleur) {
    		this.couleur = couleur;
    	}
     
    	/**
             * @return Returns the id.
             */
    	public Long getId() {
    		return id;
    	}
     
    	/**
             * @param id The id to set.
             */
    	public void setId(Long id) {
    		this.id = id;
    	}
     
    }
    Et la classe Couleur :
    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
    public class Couleur {
     
    	private Long id;
    	private String nom;
     
    	public Couleur(){
     
    	}
     
    	/**
             * @return Returns the id.
             */
    	public Long getId() {
    		return id;
    	}
     
    	/**
             * @param id The id to set.
             */
    	public void setId(Long id) {
    		this.id = id;
    	}
     
    	/**
             * @return Returns the nom.
             */
    	public String getNom() {
    		return nom;
    	}
     
    	/**
             * @param nom The nom to set.
             */
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
    }
    sylvain_2020

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 76
    Points : 49
    Points
    49
    Par défaut
    Effectivement, mais en matière de base de donnée, la table CHAT, aura toujours la structure :
    ID_CHAT integer, ID_COULEUR integer, n'est ce pas ? Sans relation explicite avec la table Couleur.

    Est ce dans le fichier hibernate Chat.hbm.xml que je dois spécifier le lien avec l'objet Couleur, en supprimant le tag <property> sur l'id_Couleur, et en le remplaçant par un tag <one-to-one> portant sur un objet Couleur ? (le lien s'effectuant sur la clé primaire de Couleur).

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2003
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 174
    Points : 194
    Points
    194
    Par défaut
    Citation Envoyé par PamelaGeek
    Effectivement, mais en matière de base de donnée, la table CHAT, aura toujours la structure :
    ID_CHAT integer, ID_COULEUR integer, n'est ce pas ? Sans relation explicite avec la table Couleur.
    ID_COULEUR devrait être une clé étrangère qui pointe vers la table Couleur.

    Citation Envoyé par PamelaGeek
    Est ce dans le fichier hibernate Chat.hbm.xml que je dois spécifier le lien avec l'objet Couleur, en supprimant le tag <property> sur l'id_Couleur, et en le remplaçant par un tag <one-to-one> portant sur un objet Couleur ? (le lien s'effectuant sur la clé primaire de Couleur).
    Oui tu dois avoir un tag <one-to-one> ou bien <many-to-one> dans le fichier Chat.hbm.xml

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 76
    Points : 49
    Points
    49
    Par défaut
    Merci, je fais un test et je vous dis...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 76
    Points : 49
    Points
    49
    Par défaut
    ça fonctionne déjà mieux, mais pas complètement bien...
    J'ai 3 objets "Service" en base. Un Service est composé de sous objets en one-to-one
    Quand j'appelle :

    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
    public static List getAllServices() {
    		_RootDAO.initialize();
    		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    		Transaction tx = session.beginTransaction();
    		List listTotale = null;
    		try {
    			listTotale = session.createQuery(" from Service").list();
    			tx.commit();
    			session.close();
    		} catch (HibernateException e) {
    			tx.rollback();
    			e.printStackTrace();
    		}
    		return listTotale;
    	}

    La méthode me ramène le premier service bien complet, avec tous ses sous objets, mais pour les deux autres services, je n'ai que les champs simples, sans les sous objets.
    Voici le mapping du Service.hbm.xml :

    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
    <class
    		name="Service"
    		table="service"
    	>
    		<id
    			name="Id"
    			type="integer"
    			column="ID_SERVICE"
    		>
    			<generator class="increment"/>
    		</id>
     
    <one-to-one name="CommuneIdCommune" class="com.osiris.hibernate.beans.Commune"   />
    <one-to-one name="TypeServiceIdTypeService" class="com.osiris.hibernate.beans.TypeService" />
    <one-to-one name="PaysIdPays" class="com.osiris.hibernate.beans.Pays" />
     
     
    		<property
    			name="NomService"
    			column="NOM_SERVICE"
    			type="string"
    			not-null="false"
    			length="40"
    		/>
     
     
    	</class>
    Ce que j'appelle "sous-objet" est "Pays", "typedeservice" et "commune".
    En base, mes 3 services sont les mêmes, à l'id près.
    Une idée ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 76
    Points : 49
    Points
    49
    Par défaut
    J'ai avancé, en fait, il se trouve que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monService.getCommuneIdCommune()
    ,
    me retourne l'identifiant du service monService et non du sous objet Commune !
    Voici le mapping de la commune :

    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
    <hibernate-mapping >
    	<class
    		name="com.osiris.hibernate.beans.Commune"
    		table="commune"
    	>
    		<id
    			name="Id"
    			type="integer"
    			column="ID_COMMUNE"
    		>
    			<generator class="increment"/>
    		</id>
     
    		<property
    			name="LibCommune"
    			column="LIB_COMMUNE"
    			type="string"
    			not-null="false"
    			length="40"
    		/>
    		<property
    			name="Insee"
    			column="INSEE"
    			type="integer"
    			not-null="false"
    			length="4"
    		/>
    		<property
    			name="Popul"
    			column="POPUL"
    			type="integer"
    			not-null="false"
    			length="4"
    		/>
    		<property
    			name="Region"
    			column="REGION"
    			type="integer"
    			not-null="false"
    			length="4"
    		/>
    		<property
    			name="Srpj"
    			column="SRPJ"
    			type="integer"
    			not-null="false"
    			length="4"
    		/>
     
     
    	</class>	
    </hibernate-mapping>

  8. #8
    Membre habitué
    Inscrit en
    Septembre 2003
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 174
    Points : 194
    Points
    194
    Par défaut
    Citation Envoyé par PamelaGeek
    J'ai avancé, en fait, il se trouve que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monService.getCommuneIdCommune()
    ,
    me retourne l'identifiant du service monService et non du sous objet Commune !
    Voici le mapping de la commune :
    Il faut donc modifier ta classe Service pour que ca te renvoie une commune ...

    En fait, ta classe devrait être du style :

    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
    public class Service{
        private Integer id;
        private Commune commune;
     
        public Service(){
        }
     
        public Integer getId{
           return id;    
        }
        public void setId(Integer anId){
           this.id = anId;
        }
        public Commune getCommune(){
           return commune;
        }
        public void setCommune(Commune aCommune){
           this.commune = aCommune;
       }
    }
    Si jamais tu veux récupérer l'id de la commune d'un service, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monService.getCommune().getId();

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 76
    Points : 49
    Points
    49
    Par défaut
    Mon nommage semble prêter à confusion, voici les attributs de la classe Service :

    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
    // primary key
    	private java.lang.Integer id;
     
    	// fields
    	private java.lang.String nomService;
     
    	// one to one
    	private com.osiris.hibernate.beans.Commune communeIdCommune;
    	private com.osiris.hibernate.beans.TypeService typeServiceIdTypeService;
    	private com.osiris.hibernate.beans.Pays paysIdPays;
     
    /**
             * Return the value associated with the column: CommuneIdCommune
             */
    	public com.osiris.hibernate.beans.Commune getCommuneIdCommune () {
    		return communeIdCommune;
    	}
    Elle porte bien un objet Commune. (entre autre).
    Hors, l'appel à monService.getCommuneIdCommune() me retourne bien une Commune, MAIS dont la clé primaire est celle du service !

    Je pense que le mapping de Service.hbm.xml n'est pas complet :
    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
    <hibernate-mapping package="com.osiris.hibernate.beans">
    	<class
    		name="Service"
    		table="service"
    	>
    		<id
    			name="Id"
    			type="integer"
    			column="ID_SERVICE"
    		>
    			<generator class="increment"/>
    		</id>
     
    <one-to-one name="CommuneIdCommune" class="com.osiris.hibernate.beans.Commune"   />
    <one-to-one name="TypeServiceIdTypeService" class="com.osiris.hibernate.beans.TypeService" />
    <one-to-one name="PaysIdPays" class="com.osiris.hibernate.beans.Pays" />
    		<property
    			name="NomService"
    			column="NOM_SERVICE"
    			type="string"
    			not-null="false"
    			length="40"
    		/>
    	</class>	
    </hibernate-mapping>
    Une idée ?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 76
    Points : 49
    Points
    49
    Par défaut
    J'ai résolu mon problème, il s'agissait d'une erreur de mapping, relation many-to-one à la place de one-to-one, et l'oubli de l'attribut COLUMN-NAME.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/04/2007, 10h26
  2. Gridview: Comment récupérer les valeurs des deux clés?
    Par Thomas_Laurent dans le forum ASP.NET
    Réponses: 1
    Dernier message: 02/02/2007, 14h54
  3. Réponses: 2
    Dernier message: 11/12/2006, 12h38
  4. [MySQL] Comment connaître les noms des tables existantes
    Par Cygnus Saint dans le forum Langage SQL
    Réponses: 7
    Dernier message: 16/03/2006, 20h26
  5. Comment dééfinir les valeurs des abscisses en Time ?
    Par marsupilami34 dans le forum Langage
    Réponses: 1
    Dernier message: 29/09/2005, 15h50

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