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

JPA Java Discussion :

Relation entre deux tables


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Par défaut Relation entre deux tables
    Bonjour,

    J'ai une table d'utilisateurs et une autre tables de Role.

    J'aimerais que dans ma table utilisateurs ait un champ foreign key qui pointe vers un enregistrement de la table role

    J'aimerais aussi que les enregistrements de la table role soit unique (une seule fois administraeur par exemple). Mais elle doit pouvoir ettre modifiable.

    Lorsque je fais plusieurs enregistrement d utilisateurs avec le meme role, mon test insère plusieurs le meme role.

    Comment je peux faire pour que le role ne soit pas enregistré en double?

    Je penses que je dois faire une vérification d'abord en effectuant un query.

    Si ce n'est pas assez clairs n'hésitez pas à me le demander.


    Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 42
    Par défaut
    Citation Envoyé par skyangel Voir le message
    Bonjour,

    J'ai une table d'utilisateurs et une autre tables de Role.

    J'aimerais que dans ma table utilisateurs ait un champ foreign key qui pointe vers un enregistrement de la table role

    J'aimerais aussi que les enregistrements de la table role soit unique (une seule fois administraeur par exemple). Mais elle doit pouvoir ettre modifiable.

    Lorsque je fais plusieurs enregistrement d utilisateurs avec le meme role, mon test insère plusieurs le meme role.

    Comment je peux faire pour que le role ne soit pas enregistré en double?

    Je penses que je dois faire une vérification d'abord en effectuant un query.

    Si ce n'est pas assez clairs n'hésitez pas à me le demander.


    Merci d'avance.
    ========================
    Pour resumer :
    - Tu as une table Utilisateur et une table Role
    - Les deux tables sont en relation 1 à +sieurs
    - La clé de Role migre dans Utilisateur

    Garantir l'unicité des roles:
    Tu le fais via le champ clé primaire (@ id) Qui peut etre si tu le veux un code saisi par l'utilisateur (l'administrateur)

    Clé étrangère
    Tu déclare dans la classe utilisateur une variable de type Role (@Column (name ="role_fk")) pour dire que le nom de la clé étrangère est role_fk

    Je ne sais pas si ca répond à ta question.
    @+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 42
    Par défaut
    Citation Envoyé par skyangel Voir le message
    Bonjour,

    Lorsque je fais plusieurs enregistrement d utilisateurs avec le meme role, mon test insère plusieurs le meme role.
    Merci d'avance.
    =========
    Tu pourrais donner une copie de tes deux classes Utilisateur et Role
    et de la classe ou tu fais l'insert dans la BD?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Par défaut
    Bonjour,

    ui je vous mets la copie.


    Pour resumer :
    - Tu as une table Utilisateur et une table Role-----> oui
    - Les deux tables sont en relation 1 à +sieurs------> non OneToOne je suis pas sur que c'est bon.

    - La clé de Role migre dans Utilisateur -->j'imaginais ainsi. la cle du role voulu et non d un ajout dans la base role.

    Garantir l'unicité des roles:
    Tu le fais via le champ clé primaire (@ id) Qui peut etre si tu le veux un code saisi par l'utilisateur (l'administrateur)

    Clé étrangère
    Tu déclare dans la classe utilisateur une variable de type Role (@Column (name ="role_fk")) pour dire que le nom de la clé étrangère est role_fk



    Utilisateurs

    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
    package fr.hh.com.persistence;
     
    import fr.hh.com.exception.ValidationException;
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.PrePersist;
    import javax.persistence.PreUpdate;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.JoinColumn;
    import javax.persistence.OneToOne;
    import javax.persistence.Table;
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
     
     
    // #[regen=yes,id=DCE.7244A99D-CC04-7321-54F4-AAA965922125]
     
    // </editor-fold> 
     
    @Entity
    @Table(name = "utilisateurs")
    public class Utilisateurs  implements java.io.Serializable{
     
        // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
        // #[regen=yes,id=DCE.4AA88341-4466-CACB-28D4-A1755B971FE9]
        // </editor-fold> 
        @Column(name="login")
        private String login;
     
        // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
        // #[regen=yes,id=DCE.E55BE869-A37F-7104-33EA-3486E8442E47]
        // </editor-fold> 
        @Column(name="mdp")
        private String mdp;
     
        @Id
         @GeneratedValue(strategy = GenerationType.AUTO)
        private Long idUtilisateurs;
     
        // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
        // #[regen=yes,id=DCE.046C2A3F-4D0F-0343-CFED-6007DEE7D718]
        // </editor-fold> 
        @OneToOne(cascade=CascadeType.ALL)
        @JoinColumn(name="role_fk" )
        private Role mRole;
     
        /********************************
         *******Constructor*************
         ********************************/
        public Utilisateurs(){
            super();
        }
        public Utilisateurs(String login, String mdp){
           // super();
            setLogin(login);
            setMdp(mdp);
     
        }
     
         /********************************
         *******Methode de verification***
         ********************************/
        @PrePersist
        @PreUpdate
        private void validateData() {
            if (login == null || "".equals(login))
                throw new ValidationException("Login  invalide");
            if (mdp == null || "".equals(mdp) || mdp.length()<6)
                throw new ValidationException("Mot de passe  invalide");
        }
     
        /********************************
         *******GETTER and SETTER********
         ********************************/
        public String getMdp() {
            return mdp;
        }
     
        public void setMdp(String mdp) {
            this.mdp = mdp;
        }
     
        public String getLogin() {
            return login;
        }
     
        public void setLogin(String login) {
            this.login = login;
        }
     
       public Role getMRole() {
           return mRole;
       }
     
       public void setMRole(Role mRole) {
           this.mRole = mRole;
       }
     
        public Long getIdUtilisateurs() {
            return idUtilisateurs;
        }
     
        public void setIdUtilisateurs(Long idUtilisateurs) {
            this.idUtilisateurs = idUtilisateurs;
        }
     }
    Role
    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
    package fr.hh.com.persistence;
     
    import javax.persistence.*;
     
     
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.ACAAAF70-24F4-C5D1-CD65-64EFEA8C876F]
    // </editor-fold> 
    @Entity
    public  class Role implements java.io.Serializable {
     
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long idRole;
     
        // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
        // #[regen=yes,id=DCE.929AB3D2-5554-4CB0-CBF0-A3D6852921C4]
        // </editor-fold> 
        private String libelle;
     
        /********************************
         *******Constructor*************
         ********************************/
        public Role() {
        }
     
        public Role(String libelle) {
            setLibelle(libelle);
        }
     
        /********************************
         *******GETTER and SETTER********
         ********************************/
        public void setLibelle(String lib) {
            this.libelle = lib;
        }
     
        public String getLibelle() {
            return this.libelle;
        }
     
        public static Role getRole(String lib) {
            if (lib != null || !lib.equals("")) {
                if (lib.equals("Laboratoire")) {
                    return new Role("Laboratoire");
                }
                if (lib.equals("Secretariat")) {
                    return new Role("Secretariat");
                }
                if (lib.equals("Administratif")) {
                    return new Role("Administratif");
                }
                if (lib.equals("Administrateur")) {
                    return new Role("Administrateur");
                }
            }
            return null;
     
        }
     
        public Long getIdRole() {
            return idRole;
        }
     
        public void setIdRole(Long idRole) {
            this.idRole = idRole;
        }
    }
    Ma classe qui enregistre.
    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
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package fr.hh.com.session.utilisateurs;
     
    import fr.hh.com.exception.ValidationException;
    import fr.hh.com.persistence.Role;
    import fr.hh.com.persistence.Utilisateurs;
    import javax.ejb.Stateless;
    import javax.ejb.TransactionAttribute;
    import javax.ejb.TransactionAttributeType;
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.EntityTransaction;
    import javax.persistence.Persistence;
    import javax.persistence.PersistenceContext;
     
    /**
     *
     * @author Benjamin
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    @Stateless(name = "UtilisateursSB",mappedName = "ejb/stateless/User")
    public class UtilisateursBean implements UtilisateursRemote {
     
        @PersistenceContext(unitName = "2hModulePU")
        private EntityManager em;
     
        public String hello() {
            return "Hello";
        }
     
        public Utilisateurs createUtilisateurs(Utilisateurs user, Role role) {
            if (user == null) {
                throw new ValidationException("Utilisateur  est null");
            }
            if(role == null){
                throw new ValidationException("Role est null");
            }
     
           user.setMRole(role);
            getEm().persist(user);
            getEm().flush();
            return getEm().merge(user);
        }
     
        public EntityManager getEm() {
            return em;
        }
     
        public void setEm(EntityManager em) {
            this.em = em;
        }
        // Add business logic below. (Right-click in editor and choose
        // "EJB Methods > Add Business Method" or "Web Service > Add Operation")
    }
    Voila. Merci d'avance pour ton aide

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 42
    Par défaut
    Citation Envoyé par skyangel Voir le message
    Bonjour,


    Lorsque je fais plusieurs enregistrement d utilisateurs avec le meme role, mon test insère plusieurs le meme role.

    Comment je peux faire pour que le role ne soit pas enregistré en double?

    Merci d'avance.

    Citation Envoyé par skyangel Voir le message
    Bonjour,
    Les deux tables sont en relation 1 à +sieurs------> non OneToOne je suis pas sur que c'est bon.
    ===========
    De facon classique, il me semble que Un Role correspond à 1 ou N Users

    Par exemple tu peut avoir un role Agent de Guichet et 15 Agent de Guichets.

    Le role traduit les droits du user. Il est est lié à une fonction.
    (Il faut y voir une analogie avec l'Acteur dans un use case)

    Je pense donc que ca doit etre une relation 1 à plusieurs.

    Mettre 1-1 signifie qu'il y a autant de roles que de users.
    Ca parait pas logique.

    Mais peut etre que je ne comprend pas bien ton probleme.


    =========

    Par ailleurs,

    Citation Envoyé par skyangel Voir le message
    public static Role getRole(String lib) {
    if (lib != null || !lib.equals("")) {
    if (lib.equals("Laboratoire")) {
    return new Role("Laboratoire");
    }
    if (lib.equals("Secretariat")) {
    return new Role("Secretariat");
    }
    if (lib.equals("Administratif")) {
    return new Role("Administratif");
    }
    if (lib.equals("Administrateur")) {
    return new Role("Administrateur");
    }
    }
    .
    C'est pas très astucieux car si du jour au lendemain il y a un nouveau role,
    (Par exemple une secretaire-stagiaire qui n'a acces qu'a une partie des options des secretaires) , tu sera obligé de revoir le code.

    ===================
    Citation Envoyé par skyangel Voir le message
    createUtilisateurs(Utilisateurs user, Role role)
    .
    Citation Envoyé par skyangel Voir le message
    user.setMRole(role);
    getEm().persist(user);
    .
    Utilisateur a une donnée memebre de type role. Tu n'a donc pas besoin de passer en argument à la fois l'utilsiateur et son role. Il suffit de faire un setRole(role) à utilisateur avant d el'envoyer à la méthode.

    =========
    Pour il me semble que tu devrais:
    1-Mettre la relation a 1-N @OneToMany
    2-Si tu veux obtenir la liste de tous les utilisateurs d'un role donné,
    Créer une donnée de type List<utilisateurs>(ou collection?) dans Roles

    Bon courage.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Par défaut
    OK merci.

    Il est vrai ce que tu dis par rapport aux agents. Je ne le voyais pas comme çà.

    Je vai donc corriger cela.

    Sinon ca va résoudre mon problème de doublon alors si je corriges de cette manière.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Par défaut
    2-Si tu veux obtenir la liste de tous les utilisateurs d'un role donné,
    Créer une donnée de type List<utilisateurs>(ou collection?) dans Roles
    Si je fais cas il me demande dans la classe role pour ma collection, de créer une relation oneToMany uni ou bi directionnel ou egalement ManyToMany.

    Pour etre dans la continuité de ta logique que dois je mettre?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Par défaut
    et c'est le meme probleme pour une table pays.

    Je dois donc louper une notion dans les relations.

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

Discussions similaires

  1. [DEBUTANT]Problème de relation entre deux tables
    Par Yomane dans le forum Schéma
    Réponses: 2
    Dernier message: 20/10/2006, 02h30
  2. relation entre deux tables
    Par tojiji dans le forum Access
    Réponses: 6
    Dernier message: 04/07/2006, 15h44
  3. Problème de relation entre deux tables + autre chose
    Par Goth_sensei dans le forum Langage SQL
    Réponses: 7
    Dernier message: 30/03/2006, 21h49
  4. [XSD] Relation entre deux tables
    Par fd59 dans le forum Valider
    Réponses: 2
    Dernier message: 10/09/2005, 00h33
  5. Relation entre deux tables
    Par manel007 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/03/2005, 17h54

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