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

QxOrm Discussion :

Relation one to one


Sujet :

QxOrm

  1. #1
    Membre averti
    Avatar de Architekth
    Profil pro
    Inscrit en
    juin 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : juin 2010
    Messages : 123
    Points : 301
    Points
    301
    Par défaut Relation one to one
    Salut,

    encore moi. J'ai un problème relatif à la compréhension des relations One-to-one. J'arrive à insérer une entrée dans la table (userdao) qui a une relation one-to-one avec une autre table (departmentdao).

    Lorsque je fais un 'save_with_all_relation', l'objet est bien sauvegardé dans la table, et si le 'departmentdao' entrée n'existe pas il est crée. Donc de se coté la ça l'air de foncitonner.

    Par contre lorsque je veux récupéré mon 'user' grâce à la méthode 'fetch_by_query_with_all_relation' et que je tente de récupéré mon 'departmentdao' et ces informations sa plante. Impossible de récupéré ces champs (departmentkey, departmentname).

    Pourriez vous me mettre un exemple de code minimaliste concernant la relation one-to-one?

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut


    Attention à la relation one-to-one : elle est en général assez peu utilisée dans un programme. C'est pourquoi j'en parle assez peu dans le tutoriel qxBlog.

    La relation one-to-one peut-être utilisée quand 2 tables de la BDD partagent le même ID (par exemple, 1 table personne peut partager le même ID qu'une table utilisateur, ou bien 1 table personne peut partager le même ID qu'une table patient pour un hôpital, etc...).

    MAIS, dans la plupart des cas, c'est une relation many-to-one qu'il faut utiliser !

    J'avais trouvé cet excellent site pour expliquer la notion de relation (pour le moment le site ne répond pas mais c'est peut-être temporaire) :
    http://www.xylax.net/hibernate/index.html

    Sinon, il y a celui-là qui s'appuie sur l'adresse précédente mais qui est beaucoup moins clair :
    http://ndpsoftware.com/HibernateMappingCheatSheet.html
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  3. #3
    Membre averti
    Avatar de Architekth
    Profil pro
    Inscrit en
    juin 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : juin 2010
    Messages : 123
    Points : 301
    Points
    301
    Par défaut
    Merci pour les liens!

    Cette relation est pas spécialement adaptée surtout dans ce cas ou c'est une relation many (user) to one (department) qui collerai plus. Seulement c'est pas moi qui décide et pour l'instant j'ai pour mission de réaliser une relation one-to-one pour toutes les classes en question dont ici 'userdao' et 'departmentdao'

    Je comprends pas trop pourquoi en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fetch_by_query_with_relation("departmentkey", query, list_User);
    je récupère tous les champs du user mais si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //getDepartment() retourne un objet DepartmentDao.
    //getDepartmentKey() retourne un long qui correspond à la clé primaire de la table departmentdao
    list_User.at(i)->getDepartment()->getDepartmentKey();
    je ne récupère pas la 'key'...

    Par contre en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list_User.at(i)->getUsername();
    j'obtiens bien le nom d'utilisateur...

    EDIT: Autant les champs du user sont mappé, mais les champs du department ne le sont pas...

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Cette relation est pas spécialement adaptée surtout dans ce cas ou c'est une relation many (user) to one (department) qui collerai plus. Seulement c'est pas moi qui décide et pour l'instant j'ai pour mission de réaliser une relation one-to-one pour toutes les classes en question dont ici 'userdao' et 'departmentdao'
    Ok, mais garde juste en tête que ce que tu es en train de faire n'est pas correct.

    Est-ce que tu peux fournir stp :
    1- ta fonction qx::register_class<userdao> ;
    2- ta fonction qx::register_class<departmentdao> ;
    3- la requête SQL générée par QxOrm au moment de l'appel à "qx::dao::fetch_by_query_with_relation()" (doit apparaitre dans ton debugger).
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  5. #5
    Membre averti
    Avatar de Architekth
    Profil pro
    Inscrit en
    juin 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : juin 2010
    Messages : 123
    Points : 301
    Points
    301
    Par défaut
    Ne t'inquiète pas j'en suis parfaitement conscient

    J'aurai une relation one-to-one entre la classe Mission et Vehicle. (un véhicule par mission).

    UserDao.cpp
    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
    namespace qx
    {
        template <> void register_class(QxClass<UserDao> &t)
        {
            qx::IxDataMember *l = t.id(&UserDao::m_login, "login");
            l->setSqlType("VARCHAR(20)");
     
            t.data(&UserDao::m_password, "password");
            t.data(&UserDao::m_profile, "profile");
            t.data(&UserDao::m_accountLocked, "accountlocked");
            t.data(&UserDao::m_loginFailedAttempts, "loginfailedattemps");
            t.data(&UserDao::m_embeddedPassword, "embeddedpassword");
     
            t.relationOneToOne(&UserDao::m_department, "departmentkey");
        }
    }
    output console:

    [QxOrm] sql query (16 ms) : SELECT UserDao.login AS UserDao_login_0, UserDao.password AS UserDao_password_0, UserDao.profile AS UserDao_profile_0, UserDao.accountlocked AS UserDao_accountlocked_0, UserDao.loginfailedattemps AS UserDao_loginfailedattemps_0, UserDao.embeddedpassword AS UserDao_embeddedpassword_0, DepartmentDao_1.departmentkey AS DepartmentDao_1_departmentkey_0, DepartmentDao_1.departmentname AS DepartmentDao_1_departmentname_0 FROM UserDao LEFT OUTER JOIN DepartmentDao DepartmentDao_1 ON DepartmentDao_1.departmentkey = UserDao.login WHERE login = :login_1_0


    DepartmentDao.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    namespace qx
    {
        template <> void register_class(QxClass<DepartmentDao> &t)
        {
            t.id(&DepartmentDao::m_departmentKey, "departmentkey");
            t.data(&DepartmentDao::m_departmentName, "departmentname");
        }
    }

    SAVE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qx::dao::save_with_relation("departmentkey", this);
    LOAD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     QVector< QSharedPointer<UserDao> > list_User;
     
        QSqlError sql_error = qx::dao::fetch_by_query_with_relation("departmentkey", query, list_User);

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    C'est bizarre : la requête SQL me semble correcte, et je viens d'essayer d'ajouter une relation one-to-one sur le projet qxBlog de la même façon que toi et ça fonctionne correctement.

    ... LEFT OUTER JOIN DepartmentDao DepartmentDao_1 ON DepartmentDao_1.departmentkey = UserDao.login WHERE login = :login_1_0
    Est-ce que tu es certain que dans ta BDD, l'équation DepartmentDao_1.departmentkey = UserDao.login est bien vérifiée ?

    Autre chose peut-être, dans ta requête WHERE, je remplacerai login = par UserDao.login =.
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  7. #7
    Membre averti
    Avatar de Architekth
    Profil pro
    Inscrit en
    juin 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : juin 2010
    Messages : 123
    Points : 301
    Points
    301
    Par défaut
    Non, DepartmentDao.departmentkey != UserDao.login

    departmentkey est un int alors que login est un QString. Donc ça peut pas être égale.

    Ce que je voudrais c'est une colonne 'departmentkey' dans UserDao qui 'pointerai' sur 'departmentkey' de DepartmentDao. Tu vois ce que j'veux dire?

    Lié departmentkey avec login ne m'intéresse pas. Il y a forcément quelques chose que j'ai mal fait, ou mal compris

    Merci en tout cas de vouloir m'aider et de consacré du temps à mon problème, c'est fort appréciable

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Non, DepartmentDao.departmentkey != UserDao.login
    ....
    Ce que je voudrais c'est une colonne 'departmentkey' dans UserDao qui 'pointerai' sur 'departmentkey' de DepartmentDao.
    Donc c'est bien ce que je disais dans ma 1ère réponse, il faut que tu utilises une relation many-to-one, et pas une relation one-to-one.

    Ça correspond exactement à la table comment du tutoriel qxBlog (comment correspond à ta classe UserDao et blog correspond à ta classe DepartmentDao) :
    http://marty-lionel.developpez.com/t...l-qxblog/#LVII

    Ça ne change rien à ton code, il faut juste que tu modifies la fonction void register_class(QxClass<UserDao> & t) en mettant :
    t.relationManyToOne(&UserDao::m_department, "departmentkey");
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  9. #9
    Membre averti
    Avatar de Architekth
    Profil pro
    Inscrit en
    juin 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : juin 2010
    Messages : 123
    Points : 301
    Points
    301
    Par défaut
    Ok merci ça fonctionne.

    Donc si j'ai bien compris, si j'veux faire une relation 'one-to-one', avec mes classes Mission et Vehicle il faudra que la clé primaire de 'Mission' soi égale à la clé primaire de 'Vehicle'? J'peux pas faire autrement.

    Bon pour la ça gène pas, il fallait bien une relation 'Many-to-One' mais bon c'est pas se qu'on m'a demandé de faire meme si je m'accord avec toi à dire qu'une relation Many-to-one était plus judicieux ici.

    Merci de ton aide en tout cas!

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Donc si j'ai bien compris, si j'veux faire une relation 'one-to-one', avec mes classes Mission et Vehicle il faudra que la clé primaire de 'Mission' soi égale à la clé primaire de 'Vehicle'?
    Oui c'est exactement ça !
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  11. #11
    Membre averti
    Avatar de Architekth
    Profil pro
    Inscrit en
    juin 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : juin 2010
    Messages : 123
    Points : 301
    Points
    301
    Par défaut
    Ben voila!

    La j'ai mieux compris le fonctionnement de cette fameuse relation 'one-to-one'!

    En tout cas !

  12. #12
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    août 2008
    Messages
    26 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2008
    Messages : 26 259
    Points : 186 037
    Points
    186 037
    Par défaut
    Citation Envoyé par QxOrm Voir le message
    J'avais trouvé cet excellent site pour expliquer la notion de relation (pour le moment le site ne répond pas mais c'est peut-être temporaire) :
    http://www.xylax.net/hibernate/index.html
    Ça ne semble plus si temporaire ; ça existe toujours dans l'archive du Web : http://web.archive.org/web/201008251...ate/index.html.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  13. #13
    Membre averti
    Avatar de Architekth
    Profil pro
    Inscrit en
    juin 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : juin 2010
    Messages : 123
    Points : 301
    Points
    301
    Par défaut
    Merci dourouc05!

    ça me sera très utile pour bien visualiser les différentes possibilités des relations

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

Discussions similaires

  1. [ASP.NET 2.0] DataBinding et relation Many to one
    Par Mandotnet dans le forum ASP.NET
    Réponses: 1
    Dernier message: 18/01/2007, 13h48
  2. Relation Many-to-One dans une application JSF
    Par KooKoolen dans le forum JSF
    Réponses: 1
    Dernier message: 27/12/2006, 14h13
  3. [Hibernate]Mapping relation one-to-one
    Par K-Kaï dans le forum Hibernate
    Réponses: 9
    Dernier message: 23/06/2006, 16h02
  4. Réponses: 3
    Dernier message: 08/06/2006, 17h38
  5. Hibernate : suppression sur relation many to one
    Par taf dans le forum Hibernate
    Réponses: 1
    Dernier message: 23/05/2006, 13h08

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