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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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
    Membre Expert

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 482
    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 confirmé
    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
    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
    Membre Expert

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 482
    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 confirmé
    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
    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
    Membre Expert

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 482
    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
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 774
    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 !

  8. #8
    Membre confirmé
    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
    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