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

C++ Discussion :

Mapping des objets C++ dans une base de donn�es


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    6
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par d�faut Mapping des objets C++ dans une base de donn�es
    Bonjour � tous,

    Tout d'abord d�sol� si mon message n'est pas situ� dans le bon forum, c'est mon premier post...

    Je cherche depuis quelques temps un framework permettant de g�rer le mapping Objets / Base de Donn�es Relationnelle. L'�quivalent de Hibernate pour Java en quelques sortes.

    Pour vous expliquer mon probl�me plus en d�tails, je travaille sur le d�veloppement d'une application en C++ utilisant une base de donn�es pour assurer la persistence des entit�s manipul�es. Il semble que les bases de donn�es objets ne font pas le poids par rapport aux bases de donn�es relationnelles, et il faut donc assurer le mapping (ORM).

    Il me semble �galement que tout faire � la main soit tr�s fastidieux...

    Avez-vous d�j� �t� confront�s � ce type de probl�me ? Quelles sont vos solutions ?

    Merci

  2. #2
    Expert confirm�

    Homme Profil pro
    Ing�nieur syst�mes et r�seaux
    Inscrit en
    F�vrier 2007
    Messages
    4 253
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Ing�nieur syst�mes et r�seaux
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : F�vrier 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par d�faut
    Oui... mais jamais en C++ directement...

    En C# et en Java, j'utilise Hibernate (ou NHibernate)

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    6
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par d�faut
    Merci beaucoup pour ta r�ponse,

    Et donc en C++, quelle solution me proposerais-tu ?

    J'ai bien pens� � passer par CORBA pour utiliser Java et Hibernate, mais j'ai peur que �a soit un peu lourd pour une simple application o� la base de donn�es est stock�e localement... Est-ce que je me trompe ?

    D'autant plus que je ne suis absolument pas expert en CORBA et Hibernate...

  4. #4
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Bonjour,
    Je ne connais pas Hibernate donc, je ne sais pas quel est le niveau d'abstraction offert.
    Pour C++, et sp�cifiquement sous Windows avec Visual et MFC, tu as CRecordSet mais il y a quand m�me un mapping � faire � la main.

  5. #5
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2004
    Messages
    1 825
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 1 825
    Par d�faut
    J'ai fait �a r�cemment.

    D'abord, dans tes objets, il faut pouvoir faire de propri�t�s nomm�es. Par exemple Client::ville portera le nom de "VILLE".
    Le mieux c'est de faire une interface "IProperty" qui poss�dera les m�thodes ToString() et FromString(). Puis une classe template CProperty<T> (o� T sera un int, un bool ou ce que tu veux).

    Ensuite, j'ai fait un fichier XML pour mapper le nom du champ en base avec le nom du champ dans ma structure de donn�es C++.

    Et enfin, je requ�te la base, pour chaque enregistrement j'ai le nom des champs, je vais dans le mapping retrouver le nom de la propri�t� � alimenter, puis j'effectue un FromString sur cette propri�t�.


    A savoir qu'il te faudra quelques petites astuces comme les classes traits de ce genre :
    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
     
    template<class T> DataTrait
    {
         static const char* CODE = "";
    };
     
    template<> DataTrait<CClient>
    {
         static const char* CODE = "CLIENT";
    };
     
    template<> DataTrait<CCommande>
    {
         static const char* CODE = "COMMANDE";
    };
     
    etc...
    Tu verras aussi que ce n'est pas tr�s judicieux de nommer les propri�t�s au sein des objets mais plut�t des classes, via les pointeurs de membres sur des propri�t�s car si tu as 2000 objets � charger par exemple, les nommages vont �tre duppliqu� dans chacun d'entre eux et la m�moire explose.

    Voil� voil�

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    6
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par d�faut
    Merci pour ta r�ponse !

    Je comprends bien l'id�e, mais j'avoue que j'ai du mal � voir pr�cis�ment comment impl�menter tout �a...
    En tout cas, �a confirme bien qu'il n'existe pas de framework correspondant en C++. Il reste donc � tout faire � la main, ou d�velopper soi m�me ce qui ressemble au framework comme tu le fais.
    Je pense qu'en ce qui me concerne, je vais d'abord faire un mapping manuel, avec l'id�e de le faire �voluer � l'avenir vers une solution proche de ce que tu proposes (question de temps...).

  7. #7
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2004
    Messages
    1 825
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 1 825
    Par d�faut
    B� en fait, je travaille sur un projet liant le C++ et la base de donn�es.

    Le client a rapport� de grosses lenteurs lors du chargement. Aussi, rien que pour connecter la moiti� des objets � la base de donn�es, nous �tions 3 et �a nous a pris 3 semaines. Et enfin, tu t'aper�ois qu'en faisant comme �a, tu charge des clients diff�remment que des commandes ou des tarifs (en raison des relations avec les autres tables etc...).

    C'est pour �a que je me suis mis � chercher cette solution, plus g�n�rique. J'ai mis 1 semaine tout seul � brancher toutes les donn�es...

  8. #8
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    6
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par d�faut
    Effectivement, je suis bien conscient que �a peut �tre tr�s long � mettre en place...

    J'ai aussi peur qu'en essayant de d�velopper ce que tu me pr�sentes (dont je ne ma�trise pas tr�s bien le principe...), je m'embourbe et que je perde �norm�ment de temps � essayer de faire fonctionner ce framework.

    Quelques pr�cisions sur ta solution :
    - Si j'ai bien compris, tous les membres de mes objets m�tiers sont des CProtoperty<T> ?
    - Les CProperty h�ritent de IProperty ?
    - La m�thode FromString() renvoie un CProperty ?
    - Les DataTraits ont les m�mes r�les que les CProperty, mais au niveau de classes/tables ?

    Comme quoi je me pose encore beaucoup de questions !

    Par ailleurs, pour �viter d'avoir des temps de chargement de la base trop long, je pense mettre en place un syst�me de "Lazy Loading" (Chargement paresseux), pour ne charger par d�faut que les membres qui sont des types de base, et charger � la demande les membres de classes qui sont des types complexes( pointeur vers une autre classe...).
    Et �a non plus, �a ne va pas �tre simple

  9. #9
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2004
    Messages
    1 825
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 1 825
    Par d�faut
    Oui en fait FromString(const std::string&) et std::string& ToString sont des fonctions virtuelles pures de IProperty. Car ton chargeur de donn� (connect� � une base, un fichier txt ou XML) ne manipulera que des IProperty* (il s'en fou que �a soit un bool�en ou un int ou autre, c'est pas son soucis, sont r�le est de charger et de passer une valeur sous forme de cha�ne de caract�re � une propri�t�. C'est ensuite la propri�t� qui va se charger de la convertir dans son format.)

    Une propri�t� ressemble � ceci :
    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
     
    template<class T>
    class CProperty : public IProperty
    {
        public:
           CProperty(const T& tValue = T());
           const T& GetValue();
           void SetValue(const T&);
     
           void FromString(const std::string& strValue); // Hérité, remplit m_tValue
           std::string ToString(); // Hérité
     
           // opérateur de conversion implicite en T
     
        private:
           T m_tValue;
    };
    Puis tu peux rajouter des m�canismes d'�couteurs etc... selon les besoin futurs


    Les DataTraits te permettent de "nommer" tes classes.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    class CClient
    {
     
    };
     
    const char* DataTrait<CClient>::CODE = "CLIENT";
    Cel� te permettra de pouvoir retrouver tes requ�tes et ton mapping de donn�es dans les fichiers xml.


    Mais ensuite tu dois g�rer les identifiants de tes donn�es (pour ensuite lorsque tu mets � jour ou supprime une donn�e en base).
    Il te faudra �galement des gestionnaires qui stockerons les donn�es charg�es et proposeront des fonctions de recherche, de r�cup�ration par identifiants, de filtres etc...

    J'ai regroup� quelques classes ci joint pour que tu t'inspires (les trucs "OPS" c'est juste parce que au lieu d'attaquer une base directement on passe par un service install� sur le serveur cible)
    Fichiers attach�s Fichiers attach�s

  10. #10
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    6
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par d�faut
    Merci beaucoup pour ton aide ! Je vais regarder tout �a de plus pr�s...

  11. #11
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2004
    Messages
    1 825
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 1 825
    Par d�faut
    Avec plaisir

  12. #12
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    pourquoi ne pas utiliser le nom de la classe, qu'on peut r�cup�rer via std::type_info::name en pratique ?

  13. #13
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2004
    Messages
    1 825
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 1 825
    Par d�faut
    Oui on peut faire �a, mais l'XML du mapping, mes clients pourront l'utiliser pour alimenter une donn�e via un autre champ dans la base.

    Donc j'ai pr�f�r� lui fournir des balises <CLIENT> que <CCustomer>

    Pour faire �a en fait, j'ai r�cup�r� quelques astuces qu'avait fait ma boite, puis pris le meilleur, selon mes besoins et mon existant, des diff�rents id�es trouv�s dans les diff�rents articles sur le net

  14. #14
    Expert confirm�

    Homme Profil pro
    Ing�nieur syst�mes et r�seaux
    Inscrit en
    F�vrier 2007
    Messages
    4 253
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Ing�nieur syst�mes et r�seaux
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : F�vrier 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par d�faut
    De toute maniere, tu ne peux pas y couper... il te faut un mapping entre la base de donn�es et les champs C++

    Hibernate (et NHibernate) permettent de le faire simplement, juste par utilisation la reflectivit� du langage.


    Grosso merdo... soit un table XXXX... tu cr�es un certain nombre de "mappings"... par exemple:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <mapping table="XXXX" class="MaClasse">
       <id column="COL_ID" type="Long" name="id">
          <generator type="sequence" value="XXXX_SEQ"/>
       </id>
       <property column="NAME" type="String" length="34" name="name"/>
       <property column="TYPE" type="String" length="12" name="type"/>
       <many-to-one class="UneAutreClasse" foreign_column="ID" column="OPTIONS_ID" name="options"/>
    </mapping>
    A partir de ce mapping, on peut g�n�rer une classe "data":
    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
     
    class MaClasse
    {
         long         id;
         string       name;
         string       type;
         UneAutreClasse* options;
     
         long     getId() const
         { return id; }
     
         string   getName() const
         { currentSession().init(this); return name; }
     
         void     setName(string t)
         { name = t; currentSession().modified(this,"name"); }
     
         string   getType() const
         { currentSession().init(this); return type; }
     
         void     setType(string t)
         { type = t; currentSession().modified(this,"type"); }
     
         MonAutreClasse* getOptions() const
         { currentSession().init(this); return options; }
     
         void     setOptions(MonAutreClasse* opt)
         { options = t; currentSession().modified(this,"options"); }
    };
    Ainsi l'objet peut avoir plusieurs �tats dans une session:
    - D�tach� (inconnu). init() ne fait rien. save() va lui assigner un identifiant, et le marquer "Charg�" et "created".
    - Identifi� (on ne connait que sont identifiant, c'est l'�tat par d�faut quand on initialise un objet externe comme "MonAutreClasse", pour �viter de multiples queries � la DB). init() va la charger (en ne touchant que les propri�t�s non modifi�es), et save() ne fait rien.
    - Charg� (on connait tout de lui). init() et save() ne font rien.

    La session peut �tre 'flush�', auquel cas, tous les objets "created" vont �tre cr��s, et tous les objets "modifi�s" vont �ter mis � jour.


    Bien sur, hibernate va beaucoup plus loin (la reflection du langage permettant de faire pratiquement tout, entre les intercepteurs sur certains objets, et autres). Mais rien n'empeche d'en copier les strat�gies principales en C++.
    Par contre, il faut un passage Mapping -> classes C++ (donc g�n�ration de code).

    A noter qu'on peut "d�duire" le mapping de la DB...

  15. #15
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2004
    Messages
    1 825
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 1 825
    Par d�faut
    Je vais aller voir un peu la doc d'Hibernate, m�me si j'en ai pas besoin, c'est pour pas mourir con


    Sinon pour requ�ter sur la base de donn�es, est-ce qu'il y a une librairie qui permette de le faire ? J'ai vu que Oracle proposait une petite librairie en C++, mais existe-t-il la m�me chose pour SQLServer ?
    Ou mieux, y a-t-il une librairie g�rant tout type de base ?


    Merci,

    A bient�t

  16. #16
    R�dacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en s�curit�
    Inscrit en
    Mai 2007
    Messages
    11 517
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Consultant en s�curit�
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par d�faut
    Citation Envoy� par mister3957 Voir le message
    Sinon pour requ�ter sur la base de donn�es, est-ce qu'il y a une librairie qui permette de le faire ? J'ai vu que Oracle proposait une petite librairie en C++, mais existe-t-il la m�me chose pour SQLServer ?
    Ou mieux, y a-t-il une librairie g�rant tout type de base ?
    J'aime bien ODBC, c'est l'API de base Microsoft (si tu es sur une plateforme Microsoft) et c'est ind�pendant de la base de donn�es (Oracle, SQL Server, MySQL, ...) pour peu que tu aies les drivers ODBC de la base de donn�es que tu utilises.
    Raymond
    Vous souhaitez participer � la rubrique R�seaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs syst�me et r�seau � configurer leurs �quipements SNMP r�seau.
    e-verbe Un logiciel de conjugaison des verbes de la langue fran�aise.

    Ma page personnelle sur DVP
    .

  17. #17
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2004
    Messages
    1 825
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 1 825
    Par d�faut
    Ouais je pr�f�re �viter ODBC...

    Je pense que j'vais r�fl�chir un peu plus et me faire une interface de manipulation de BDD puis encapsuler l'impl�mentation dans des DLL (une pour chaque type de base et m�me pour fichier plat, xml etc...)


    Merci

  18. #18
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    ODBC n'a rien � voir avec Microsoft, c'est une API standard. Microsoft n'en fournit qu'une impl�mentation.

  19. #19
    R�dacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en s�curit�
    Inscrit en
    Mai 2007
    Messages
    11 517
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Consultant en s�curit�
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par d�faut
    Citation Envoy� par loufoque Voir le message
    ODBC n'a rien � voir avec Microsoft, c'est une API standard. Microsoft n'en fournit qu'une impl�mentation.
    C'est vrai, je me suis emport�, j'ai oubli� qu'il existait d'autres impl�mentations sur d'autres OS.
    A ma d�charge, ODBC a �t� pouss� d�s le d�but par Microsoft et c'est Microsoft qui a fournit la premi�re impl�mentation.
    Raymond
    Vous souhaitez participer � la rubrique R�seaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs syst�me et r�seau � configurer leurs �quipements SNMP r�seau.
    e-verbe Un logiciel de conjugaison des verbes de la langue fran�aise.

    Ma page personnelle sur DVP
    .

Discussions similaires

  1. Insertion des contenus gtkentry dans une base de donn�es
    Par charles9 dans le forum GTK+ avec C & C++
    R�ponses: 2
    Dernier message: 02/06/2008, 18h13
  2. Liste des tables existantes dans une base de donn�es
    Par Lorenzole+bo dans le forum VBA Access
    R�ponses: 1
    Dernier message: 13/11/2007, 20h15
  3. [Conception] Stocker des fichiers multim�dia dans une base de donn�es
    Par haifa84 dans le forum PHP & Base de donn�es
    R�ponses: 3
    Dernier message: 11/03/2006, 17h47
  4. Int�gration des fichier XML dans une base de donn�es MySQL
    Par bebemoundjou dans le forum XQUERY/SGBD
    R�ponses: 8
    Dernier message: 25/11/2005, 22h41
  5. Recuperation des objet ole dans une base SQL
    Par TOPGUN89 dans le forum MS SQL Server
    R�ponses: 7
    Dernier message: 25/11/2005, 09h14

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