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 :

[Débutante] Valeur par énumération


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut [Débutante] Valeur par énumération
    Bonjour,

    Je débute complètement dans les mappings Hibernate et j'ai une question qui me vient à l'esprit.

    Imaginons que j'ai un utilisateur représenté par un identifiant et un nom.
    Et j'ai des profils, ceux-ci sont en nombre limité (par exemple : Lecteur, Ecrivain et Administrateur).

    Je voudrais donc mettre les profils dans une énumération Java telle que celle-ci :
    Code Java : 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 enum Profil {
    	LECTEUR("Lecteur"),
    	ECRIVAIN("Ecrivain"),
    	ADMIN("Administrateur");
     
    	private String value;
     
    	private Profil(String value) {
    		this.value = value;
    	}
     
    	public String getValue() {
    		return this.value;
    	}
    }

    Un utilisateur peut avoir plusieurs profils. J'aimerais donc un objet Utilisateur comme ceci :
    Code Java : 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
    import java.util.Set;
     
    public class Utilisateur {
    	private Long id;
    	private String nom;
    	private Set<Profil> profils;
     
    	public Long getId() {
    		return this.id;
    	}
     
    	public void setId(Long id) {
    		this.id = id;
    	}
     
    	public String getNom() {
    		return this.nom;
    	}
     
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
    	public Set<Profil> getProfils() {
    		return this.profils;
    	}
     
    	public void setProfils(Set<Profil> profils) {
    		this.profils = profils;
    	}
    }

    Comment puis-je mapper l'utilisateur pour avoir dans ma base le modèle suivant ?

    Table UTILISATEUR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    id	nom
    --------------
    1	Toto
    2	Titi
    3	Tata
    Table UTILISATEUR_PROFIL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    id_utilisateur	profil
    --------------
    1		LECTEUR
    1		ECRIVAIN
    2		ADMIN
    3		LECTEUR

  2. #2
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut
    Vous croyez que ceci s'approche de la solution ?

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
    	<class name="fr.societe.domain.Utilisateur" table="UTILISATEUR">
    		<id name="id" column="ID"/>
    		<property name="nom" column="NOM"/>
    		<set name="profils" table="UTILISATEUR_PROFIL" collection-type="fr.societe.domain.Profil">
    			<key column="id_utilisateur"/>
    			<element column="profil"/>
    		</set>
    	</class>
    </hibernate-mapping>

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    En l'occurrence, la clé primaire de la table UTILISATEUR_PROFIL doit être
    id_utilisateur, profil.

    Ci dessous, un mapping très proche de ce que tu cherches (avec d'autres noms)

    Mapping Hiberante
    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 13 oct. 2009 11:34:27 by Hibernate Tools 3.2.4.GA -->
    <hibernate-mapping>
        <class name="com.obia.safe.hibernate.Utilisateur" table="utilisateur">
            <id name="uid" type="string">
                <column name="UID" length="32" />
                <generator class="assigned" />
            </id>
            <property name="password" type="string">
                <column name="Password" length="32" />
            </property>
            <property name="nom" type="string">
                <column name="Nom" length="80" not-null="true" />
            </property>
            <property name="telephone" type="string">
                <column name="Telephone" length="30" />
            </property>
            <property name="fax" type="string">
                <column name="Fax" length="30" />
            </property>
            <property name="email" type="string">
                <column name="Email" length="80" />
            </property>
            <set name="roles" inverse="true" lazy="true" table="role" fetch="select">
                <key>
                    <column name="UID" length="32" not-null="true" />
                </key>
                <one-to-many class="com.obia.safe.hibernate.Role" />
            </set>
        </class>
    </hibernate-mapping>
    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 13 oct. 2009 11:34:27 by Hibernate Tools 3.2.4.GA -->
    <hibernate-mapping>
        <class name="com.obia.safe.hibernate.Role" table="role">
            <composite-id name="id" class="com.obia.safe.hibernate.RoleId">
                <key-property name="uid" type="string">
                    <column name="UID" length="32" />
                </key-property>
                <key-property name="role" type="string">
                    <column name="Role" length="45" />
                </key-property>
            </composite-id>
            <many-to-one name="utilisateur" class="com.obia.safe.hibernate.Utilisateur" update="false" insert="false" fetch="select">
                <column name="UID" length="32" not-null="true" />
            </many-to-one>
        </class>
    </hibernate-mapping>
    Classes correspondantes
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    package com.obia.safe.hibernate;
     
    // Generated 13 oct. 2009 11:34:25 by Hibernate Tools 3.2.4.GA
     
    import java.util.HashSet;
    import java.util.Set;
     
    /**
     * Utilisateur generated by hbm2java
     */
    public class Utilisateur implements java.io.Serializable
    {
     
        private String uid;
        private String password;
        private String nom;
        private String telephone;
        private String fax;
        private String email;
        private Set roles = new HashSet(0);
     
        public Utilisateur()
        {
        }
     
        public Utilisateur(String uid, String nom)
        {
            this.uid = uid;
            this.nom = nom;
        }
     
        public Utilisateur(String uid, String password, String nom, String telephone, String fax, String email, Set roles)
        {
            this.uid = uid;
            this.password = password;
            this.nom = nom;
            this.telephone = telephone;
            this.fax = fax;
            this.email = email;
            this.roles = roles;
        }
     
        public String getUid()
        {
            return this.uid;
        }
     
        public void setUid(String uid)
        {
            this.uid = uid;
        }
     
        public String getPassword()
        {
            return this.password;
        }
     
        public void setPassword(String password)
        {
            this.password = password;
        }
     
        public String getNom()
        {
            return this.nom;
        }
     
        public void setNom(String nom)
        {
            this.nom = nom;
        }
     
        public String getTelephone()
        {
            return this.telephone;
        }
     
        public void setTelephone(String telephone)
        {
            this.telephone = telephone;
        }
     
        public String getFax()
        {
            return this.fax;
        }
     
        public void setFax(String fax)
        {
            this.fax = fax;
        }
     
        public String getEmail()
        {
            return this.email;
        }
     
        public void setEmail(String email)
        {
            this.email = email;
        }
     
        public Set getRoles()
        {
            return this.roles;
        }
     
        public void setRoles(Set roles)
        {
            this.roles = roles;
        }
     
    }
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    package com.obia.safe.hibernate;
     
    // Generated 13 oct. 2009 11:34:25 by Hibernate Tools 3.2.4.GA
     
    /**
     * RoleId generated by hbm2java
     */
    public class RoleId implements java.io.Serializable
    {
     
        private String uid;
        private String role;
     
        public RoleId()
        {
        }
     
        public RoleId(String uid, String role)
        {
            this.uid = uid;
            this.role = role;
        }
     
        public String getUid()
        {
            return this.uid;
        }
     
        public void setUid(String uid)
        {
            this.uid = uid;
        }
     
        public String getRole()
        {
            return this.role;
        }
     
        public void setRole(String role)
        {
            this.role = role;
        }
     
        public boolean equals(Object other)
        {
            if ((this == other)) return true;
            if ((other == null)) return false;
            if (!(other instanceof RoleId)) return false;
            RoleId castOther = (RoleId) other;
     
            return ((this.getUid() == castOther.getUid()) || (this.getUid() != null && castOther.getUid() != null && this.getUid().equals(
                    castOther.getUid())))
                    && ((this.getRole() == castOther.getRole()) || (this.getRole() != null && castOther.getRole() != null && this.getRole()
                            .equals(castOther.getRole())));
        }
     
        public int hashCode()
        {
            int result = 17;
     
            result = 37 * result + (getUid() == null ? 0 : this.getUid().hashCode());
            result = 37 * result + (getRole() == null ? 0 : this.getRole().hashCode());
            return result;
        }
     
    }
    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
     
    package com.obia.safe.hibernate;
     
    // Generated 13 oct. 2009 11:34:25 by Hibernate Tools 3.2.4.GA
     
    /**
     * Role generated by hbm2java
     */
    public class Role implements java.io.Serializable
    {
     
        private RoleId id;
        private Utilisateur utilisateur;
     
        public Role()
        {
        }
     
        public Role(RoleId id, Utilisateur utilisateur)
        {
            this.id = id;
            this.utilisateur = utilisateur;
        }
     
        public RoleId getId()
        {
            return this.id;
        }
     
        public void setId(RoleId id)
        {
            this.id = id;
        }
     
        public Utilisateur getUtilisateur()
        {
            return this.utilisateur;
        }
     
        public void setUtilisateur(Utilisateur utilisateur)
        {
            this.utilisateur = utilisateur;
        }
     
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    En l'occurrence, la clé primaire de la table UTILISATEUR_PROFIL doit être
    id_utilisateur, profil.
    A noter que UTILISATEUR_PROFIL est une pseudo table de liaison entre la table UTILISATEUR et la table (ou plutôt l'énumération profil). Donc qu'il n'y a pas nécessairement de clef primaire mis à part effectivement sur l'ensemble des colonnes.

    A noter aussi que la question porte sur la gestion de l'énumération bien plus que sur la gestion du one-to-many et/ou inversement.

    Mais merci de la réponse quand même

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Hibernate ne gère pas l'enum, pour lui, ce sera un champ du type cible de l'enum. Si tu as une enum de String, hibernate gèrera un champ String.
    Pour moi, utilisateur_profil n'est pas une pseudo-table mais bien une table à part entière dont un champ est une enum.

    Pour ce qui est de la clé, Il est largement recommandé d'avoir une clé primaire, sans quoi, le résultat peut être aléatoire...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Hibernate ne gère pas l'enum, pour lui, ce sera un champ du type cible de l'enum. Si tu as une enum de String, hibernate gèrera un champ String.
    Pour moi, utilisateur_profil n'est pas une pseudo-table mais bien une table à part entière dont un champ est une enum.

    Pour ce qui est de la clé, Il est largement recommandé d'avoir une clé primaire, sans quoi, le résultat peut être aléatoire...
    J'ai bien dit un pseudo "table de liaison" mais pas une pseudo table

    Bref... Pour la clef primaire, je ne vais pas m'attarder dessus. De toute façon, je n'ai même pas le droit de mettre des clefs etrangères. Ici c'est l'art du sale... malheureusement...

    Tu crois que le mapping que j'ai mis ci-dessus peut correspondre ? J'ai un peu du mal entre les set, one-to-many, many-to-one et many-to-many...

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/05/2007, 14h05
  2. [Débutant] Valeur par défaut lors de la création.
    Par Baban29 dans le forum Requêtes
    Réponses: 5
    Dernier message: 05/04/2007, 09h40
  3. Réponses: 5
    Dernier message: 10/01/2007, 15h37
  4. Débutant -> Valeur par defaut
    Par broke dans le forum Access
    Réponses: 6
    Dernier message: 22/09/2005, 23h23
  5. [Débutant(e)]valeur par défaut dans méthodes
    Par seiryujay dans le forum Langage
    Réponses: 3
    Dernier message: 13/07/2005, 12h02

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