Hello !
Petite question: comment faire pour générer l'id (long auto-incrementé) de la classe ORM Toto pour l'insert dans une QxCollection<long, Toto : : Ptr> ?
(je sais pas si je suis très clair)...
Merci par avance !
Hello !
Petite question: comment faire pour générer l'id (long auto-incrementé) de la classe ORM Toto pour l'insert dans une QxCollection<long, Toto : : Ptr> ?
(je sais pas si je suis très clair)...
Merci par avance !
je sais pas si je suis très clair=> j'avoue que je comprends pas trop la question
Un ID est généré pendant l'appel à la fonction qx::dao::insert.
A noter : la fonction qx::dao::insert peut prendre en paramètre une instance, un pointeur vers une instance, ou bien une collection d'objets (je ne sais pas si ça répond à ta question).
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.
Note: Je suis en train de me rendre compte que je n'ai peut être pas bien compris la notion de relation. Voir autre post que je vais écrire plus tard.
Ok, donc désolé, je ré-explique:
J'ai créé une table Form comme ceci:
Le formulaire est composé de pages (je ne donne pas le code de FormPage car c'est basique, disons que c'est une classe qui ressemble à Form.
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 class Form { public: // -- typedef typedef Form This; typedef boost::shared_ptr<This> Ptr; typedef qx::QxCollection<long, FormPage::Ptr> ListPageT; public: Form() {} virtual ~Form() {} public: long id; QString name; ListPageT pages; };
On veut maintenant créer un formulaire avec des pages.
Du coup, j'insère mes éléments comme ceci:
Le problème qui se pose est que je n'ai pas l'id avant qu'il ne soit inséré dans la bdd à l'appel de cette fonction:
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 Form::Ptr formToORM( const core::form::Form & formDoc ) { Form::Ptr dbForm( new Form() ); { using namespace core; dbForm->name = formDoc.name().c_str(); BOOST_FOREACH( const form::FormPage & page, formDoc.pages() ) { FormPage::Ptr dbFormPage = formPageToORM( page ); dbForm->pages.insert( dbFormPage->id, dbFormPage ); } } return dbForm; }
dbForm->pages.insert( dbFormPage->id, dbFormPage );
En fait, je crois que je n'ai pas bien compris: l'insert d'une collection prend un id (premier paramètre de la template) qui ne représente pas du tout l'id de l'enregistrement de la relation dans la BDD, c'est ça ? Je crois que je confonds les deux tout simplement !
Oui tu confonds je pense : qx::QxCollection n'a absolument rien à voir avec la notion de relation dans QxOrm !En fait, je crois que je n'ai pas bien compris: l'insert d'une collection prend un id (premier paramètre de la template) qui ne représente pas du tout l'id de l'enregistrement de la relation dans la BDD, c'est ça ? Je crois que je confonds les deux tout simplement !
Il faut que tu vois la classe qx::QxCollection comme un conteneur classique, du même style que std::vector, QList ou boost::unordered_map.
Pour plus de détails sur ce nouveau conteneur, il y a une explication dans la FAQ : Pourquoi QxOrm fournit un nouveau type de container qx::QxCollection<Key, Value> ?
Si ce n'est toujours pas clair malgré l'explication de la FAQ => n'hésite pas à me redemander...
Donc, le 1er élément du template qx::QxCollection est une clé (pour accéder rapidement à la valeur associée), pas forcément un ID provenant d'une BDD (c'est une hash_table en fait).
Dans le cas d'un élément provenant d'une BDD, ça parait logique de mettre comme clé son ID (mais ce n'est pas une obligation).
Concernant ton code, de ce que je comprends, tu as une structure FormA et PageA que tu souhaites convertir en FormB et PageB en utilisant les méthodes formToORM() et formPageToORM().
Je vois 2 solutions à ta problématique :
1- soit tu décides d'utiliser un autre conteneur car tu ne connais pas de clé au moment de l'appel à formPageToORM() (car ton objet n'est pas encore en BDD) => à ce moment là, tu peux utiliser une QList<FormPage:: Ptr> par exemple.
2- soit tu continues à utiliser qx::QxCollection et c'est à toi de définir une clé au moment de l'insertion dans la collection. Tu peux utiliser la logique suivante dans ton code : si ma page n'existe pas encore en BDD, j'utilise une clé négative. Ce qui donnerait quelque chose comme ça :
Ensuite, au moment de faire la sauvegarde en BDD, tu testes la clé :
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 Form::Ptr formToORM( const core::form::Form & formDoc ) { Form::Ptr dbForm( new Form() ); { using namespace core; dbForm->name = formDoc.name().c_str(); long lKey = 0; BOOST_FOREACH( const form::FormPage & page, formDoc.pages() ) { FormPage::Ptr dbFormPage = formPageToORM( page ); if (page->id != 0) { lKey = page->id; } else { lKey--; } dbForm->pages.insert( lKey, dbFormPage ); } } return dbForm; }
- si clé positive => je fais un update
- si clé négative => je fais un insert
EDIT : Pense à la méthode reserve() pour optimiser un peu ton code![]()
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.
Ah ok d'accord, je vois !
Merci pour toutes ces explications.
En fait, je croyais que quand j'allais faire l'insert de ma classe Form avec qx::dao::insert, ça allait enregistrer toutes les relations (donc également les pages qui sont dans la collection).
Je vais voir comment je peux faire du coup
Merci !
C'est le même principe que pour le fetch :je croyais que quand j'allais faire l'insert de ma classe Form avec qx::dao::insert, ça allait enregistrer toutes les relations
* qx::dao::insert : ne va insérer que dans 1 seule table ;
* qx::dao::insert_with_relation : va insérer dans plusieurs tables.
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.
Partager