Files
XdlOrm/doc/qxorm_fr/tutorial.html
2026-04-03 11:32:07 +08:00

1209 lines
83 KiB
HTML
Raw Blame History

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<title>QxOrm : C++ Qt ORM Object Relational Mapping database library - QxEntityEditor : C++ Qt entities graphic
editor (data model designer and source code generator)</title>
<link rel='stylesheet' type='text/css' href='./resource/qxorm_style.css'>
<script type="text/javascript" src="./resource/jquery.min.js"></script>
<script type="text/javascript" src="./resource/qxorm_script.js"></script>
</head>
<body>
<table border="0" style="width: 80%" align="center">
<col>
<col>
<col>
<col>
<col>
<tbody>
<tr>
<td><a href="./home.html"><img alt="QxOrm" src="./resource/logo_qxorm_and_qxee.png" align="left"
border="0"></a></td>
<td align="right" style="vertical-align:bottom">
<div id="qx_search">
<gcse:search></gcse:search>
</div>
</td>
<td width="15"></td>
<td align="right" style="vertical-align:bottom">
<img alt="Windows" src="./resource/logo_windows.gif" width="35" height="35">
<img alt="Linux" src="./resource/logo_linux.gif" width="35" height="35">
<img alt="Macintosh" src="./resource/logo_mac.gif" width="35" height="35">
</td>
<td width="70"><img alt="C++" src="./resource/logo_cpp.gif" width="50" height="50" align="right"></td>
</tr>
</tbody>
</table>
<hr style="width: 80%" align="center" size="1" color="#100D5A">
<table border="0" style="width: 80%" align="center">
<col>
<col>
<col>
<col>
<col>
<col>
<tbody>
<tr>
<td align="center"><a href="./home.html" class="btn_nav">Accueil</a></td>
<td align="center"><a href="./download.html" class="btn_nav">T<EFBFBD>l<EFBFBD>chargement</a></td>
<td align="center"><a href="./quick_sample.html" class="btn_nav">Exemple rapide</a></td>
<td align="center" onmouseover="showHideElementById('menu_tuto', true);"
onmouseout="showHideElementById('menu_tuto', false);">
<a href="./tutorial.html" class="btn_nav">Tutoriel (4)</a>
<table class="table_menu_tuto">
<tbody>
<tr>
<td>
<div id="menu_tuto" class="div_menu_tuto">
<a href="./tutorial_3.html" class="btn_sub_menu">install QxOrm</a><br />
<a href="./tutorial.html" class="btn_sub_menu">qxBlog</a><br />
<a href="./tutorial_2.html" class="btn_sub_menu">qxClientServer</a><br />
<a href="./tutorial_4.html" class="btn_sub_menu">QxEntityEditor videos</a>
</div>
</td>
</tr>
</tbody>
</table>
</td>
<td align="center" onmouseover="showHideElementById('menu_manual', true);"
onmouseout="showHideElementById('menu_manual', false);">
<a href="./manual.html" class="btn_nav">Manuel (2)</a>
<table class="table_menu_manual">
<tbody>
<tr>
<td>
<div id="menu_manual" class="div_menu_manual">
<a href="./manual.html" class="btn_sub_menu">Manuel QxOrm</a><br />
<a href="./manual_qxee.html" class="btn_sub_menu">Manuel QxEntityEditor</a><br />
</div>
</td>
</tr>
</tbody>
</table>
</td>
<td align="center"><a href="./link.html" class="btn_nav">Forum</a></td>
<td align="center"><a href="./customer.html" class="btn_nav">Nos clients</a></td>
</tr>
</tbody>
</table>
<hr style="width: 80%" align="center" size="1" color="#100D5A">
<table border="0" style="width: 80%" align="center">
<col>
<col>
<col>
<col>
<col>
<col>
<tbody>
<tr>
<td align="left" valign="top">
<font size="2" class="txt_with_shadow">QxOrm &gt;&gt; Tutoriel &gt;&gt; qxBlog</font>
</td>
<td align="right" valign="top">
<table cellspacing="0" cellpadding="1">
<col>
<col>
<tbody>
<tr>
<td align="right" valign="top">
<font size="2" class="txt_with_shadow">Version courante :&nbsp;</font>
</td>
<td align="left" valign="top">
<font size="2" class="txt_with_shadow">QxOrm 1.5.0 - <a href="../doxygen/index.html"
target="_blank">documentation en ligne de la biblioth<74>que QxOrm</a> - <a
href="https://github.com/QxOrm/QxOrm" target="_blank">GitHub</a></font>
</td>
</tr>
<tr>
<td align="right" valign="top">
<font size="2" class="txt_with_shadow"></font>
</td>
<td align="left" valign="top">
<font size="2" class="txt_with_shadow">QxEntityEditor 1.2.8</font>
</td>
</tr>
</tbody>
</table>
</td>
<td width="10px"></td>
<td width="40px" height="30px"><a href="../qxorm_fr/tutorial.html"><img alt="Version fran<61>aise du site"
src="./resource/FR.png" width="40" height="30" border="0"></a></td>
<td width="40px" height="30px"><a href="../qxorm_en/tutorial.html"><img alt="Web site english version"
src="./resource/GB.png" width="40" height="30" border="0"></a></td>
<td width="40px" height="30px"><a href="http://sites.google.com/site/qxormpostgres/" target="_blank"><img
alt="" src="./resource/ES.png" width="40" height="30" border="0"></a></td>
</tr>
</tbody>
</table>
<table border="1" frame="vsides" rules="cols" style="width: 80%" align="center" cellpadding="6" bgcolor="#F2F2F4">
<col>
<tbody>
<tr>
<td align="justify">
<table border="0" cellpadding="4">
<col>
<col>
<tbody>
<tr>
<td>
<font class="txt_with_shadow" color="#0B0B61" size="4"><i>S<EFBFBD>lection du tutoriel : </i></font>
</td>
<td align="left">
<a href="./tutorial.html" class="btn_tuto_selected">Tuto n<>1 : qxBlog</a>
<a href="./tutorial_2.html" class="btn_tuto">Tuto n<>2 : qxClientServer</a>
<a href="./tutorial_3.html" class="btn_tuto">Tuto n<>3 : install QxOrm</a>
<a href="./tutorial_4.html" class="btn_tuto">Tuto n<>4 : video QxEntityEditor</a>
</td>
</tr>
</tbody>
</table>
<hr style="width: 100%" align="center" size="1" color="#100D5A">
<br>
<table border="0" style="width: 100%" align="center">
<col>
<col>
<tbody>
<tr>
<td>Dans ce chapitre, nous allons traiter plusieurs fonctionnalit<69>s de la biblioth<74>que
<b>QxOrm</b> avec la cr<63>ation
d'un projet de <b>gestion d'un blog en C++</b>.<br>
Le tutoriel <b>qxBlog</b> est constitu<74> des <20>tapes suivantes :
<ul>
<li><a href="#tuto_1">1- Projet <b>qxBlog</b> - gestion d'un blog en C++</a></li>
<li><a href="#tuto_2">2- Arborescence du projet <b>qxBlog</b></a></li>
<li><a href="#tuto_3">3- Contenu du fichier <i>qxBlog.pro</i></a></li>
<li><a href="#tuto_4">4- Contenu du fichier <i>export.h</i></a></li>
<li><a href="#tuto_5">5- Contenu du fichier <i>precompiled.h</i></a></li>
<li><a href="#tuto_6">6- Contenu des fichiers <i>author.h</i> et <i>author.cpp</i>
(relation <i>one-to-many</i>)</a></li>
<li><a href="#tuto_7">7- Contenu des fichiers <i>comment.h</i> et <i>comment.cpp</i>
(relation <i>many-to-one</i>)</a></li>
<li><a href="#tuto_8">8- Contenu des fichiers <i>category.h</i> et <i>category.cpp</i>
(relation <i>many-to-many</i>)</a></li>
<li><a href="#tuto_9">9- Contenu des fichiers <i>blog.h</i> et <i>blog.cpp</i> (relations
<i>one-to-many</i>, <i>many-to-one</i> et <i>many-to-many</i>)</a></li>
<li><a href="#tuto_10">10- Contenu du fichier <i>main.cpp</i></a></li>
<li><a href="#tuto_11">11- Annexe - exemple de relation <i>one-to-one</i> avec la classe
<i>person</i></a></li>
<li><a href="#tuto_12">12- Remerciements</a></li>
</ul>
</td>
<td width="200" align="center" valign="top"><a href="./resource/qt_ambassador_logo.png"
target="_blank"><img alt="qt_ambassador" src="./resource/qt_ambassador_logo_150x150.png"
width="150" height="150" border="0"></a><br>
<b>
<font size="2">QxOrm library has been accepted into the <a
href="http://forum.qt.io/category/24/qt-ambassador-program" target="_blank">Qt
Ambassador Program</a></font>
</b>
</td>
</tr>
</tbody>
</table>
<i>Remarque :</i> ce tutoriel est <20>galement disponible sur le site <a
href="http://marty-lionel.developpez.com/tutoriels/qt/qxorm-tutoriel-qxblog/"
target="_blank">www.developpez.com</a>.<br>
<br>
<i>Autre remarque :</i> il existe un projet similaire dans le dossier '<i>./test/qxBlogCompositeKey/</i>'
pour montrer comment d<>finir des identifiants sur plusieurs colonnes (<i>composite key</i>).<br>
Pour plus d'informations sur cette notion de '<i>multi-columns primary key</i>' : <a
href="../qxorm_fr/manual.html#manual_3010">suivre ce lien du manuel utilisateur</a>.<br>
<br><br>
<a name="tuto_1"><u>
<font color="#100D5A">1- Projet <b>qxBlog</b> -
gestion d'un blog en C++ avec les tables suivantes :</font>
</u></a>
<ul>
<li><b>blog</b> : un <i>blog</i> est <20>crit par un <i>author</i>, peut avoir plusieurs <i>comment</i>
et peut <20>tre associ<63> <20> plusieurs <i>category</i> ;
</li>
<li><b>author</b> : un <i>author</i> peut r<>diger plusieurs <i>blog</i> ;
</li>
<li><b>comment</b> : un <i>comment</i> est associ<63> <20> un <i>blog</i> ;
</li>
<li><b>category</b> : une <i>category</i> r<>f<EFBFBD>rence plusieurs <i>blog</i>.
</li>
</ul>
<br>
<a name="tuto_2"><u>
<font color="#100D5A">2- Le projet <b>qxBlog</b> du tutoriel a
l'arborescence suivante :</font>
</u></a><br>
<br>
<table border="1" style="width: 100%" bgcolor="#FFFFFF">
<col>
<col>
<col>
<tbody>
<tr>
<td><i>./qxBlog/ <br>
./qxBlog/qxBlog.pro <br>
./qxBlog/qxBlog.sqlite </i> </td>
<td><i>./qxBlog/include/precompiled.h <br>
./qxBlog/include/export.h <br>
./qxBlog/include/author.h <br>
./qxBlog/include/blog.h <br>
./qxBlog/include/category.h <br>
./qxBlog/include/comment.h </i> </td>
<td><i>./qxBlog/src/author.cpp <br>
./qxBlog/src/blog.cpp <br>
./qxBlog/src/category.cpp <br>
./qxBlog/src/comment.cpp <br>
./qxBlog/src/main.cpp </i> </td>
</tr>
</tbody>
</table>
<p><i>Remarque</i> : le code source de ce tutoriel est disponible dans le dossier
<i>./test/qxBlog/</i> de la distribution de <b>QxOrm</b>.<br>
Le fichier <i>qxBlog.sqlite</i> correspond <20> la base de donn<6E>es du tutoriel au format <a
href="http://sqlite.org/" target="_blank"><i>SQLite</i></a>.
</p>
<p><br>
<a name="tuto_3"><u>
<font color="#100D5A">3- Contenu du fichier <b>qxBlog.pro</b>
:</font>
</u></a><br>
<br>
Ce fichier permet la compilation du projet par l'outil <i>qmake</i>
fourni par le framework Qt. <br>
L'outil <i>qmake</i> est multiplateforme, ce qui signifie que le
projet <b>qxBlog</b> peut <20>tre compil<69> sous Windows, Linux, Mac, etc.
<br>
Le fichier <i>qxBlog.pro</i> d<>crit la liste de tous les fichiers du
projet (<i>header</i> + <i>source</i>) ainsi que les d<>pendances du projet. <br>
Le projet <b>qxBlog</b> est d<>pendant de la biblioth<74>que <b>QxOrm</b> qui est
elle-m<>me d<>pendante des excellents frameworks <b>boost</b> et <b>Qt</b>. <br>
Pour simplifier la gestion des d<>pendances du projet, il est possible
d'inclure le fichier <i>QxOrm.pri</i>.<br>
Une information importante <20> renseigner dans le fichier
<i>qxBlog.pro</i> est la d<>finition d'une variable indiquant que l'on
est en train de compiler le projet (voir le fichier <i>export.h</i>).
En effet, tout comme le m<>canisme des DLL sous Windows, la biblioth<74>que
QxOrm a besoin de cette information pour exporter ou importer certaines
classes. Pour notre projet, cette variable se nomme
<b><i>_BUILDING_QX_BLOG</i></b>.
</p>
<p><a href="./resource/qxBlog.qxBlog.pro"><img alt="qxBlog.pro" src="./resource/qxBlog.pro.jpg"
width="417" height="551" border="0"></a></p>
<p><br>
<a name="tuto_4"><u>
<font color="#100D5A">4- Contenu du fichier <i>export.h</i>
:</font>
</u></a><br>
<br>
L'<27>criture d'une <i>DLL</i> sous Windows impose d'avoir un fichier de ce type
pour la gestion des <i>'export/import'</i> des classes, fonctions,
variables, etc. <br>
<b>QxOrm</b> utilise ce m<>me m<>canisme pour fournir certaines fonctionnalit<69>s
: le fichier <i>export.h</i> est donc indispensable pour tous les
projets qui d<>pendent de <b>QxOrm</b>.<br>
<br>
<i>Remarque</i> : pour simplifier, il est possible de sch<63>matiser le m<>canisme des <i>DLL</i>
de la fa<66>on suivante :
</p>
<ul>
<li>lorsque la DLL est compil<69>e, l'outil de compilation exporte
chaque classe ;</li>
<li>lorsqu'une autre DLL d<>pendante de la pr<70>c<EFBFBD>dente est compil<69>e,
l'outil de compilation importe les classes n<>cessaires de la DLL
pr<70>c<EFBFBD>dente.</li>
</ul><br>
<table border="1" bgcolor="#FFFFFF">
<col>
<tbody>
<tr>
<td title="export.h">
<pre><span class="pre">#ifndef _QX_BLOG_EXPORT_H_
#define _QX_BLOG_EXPORT_H_
#ifdef _BUILDING_QX_BLOG
#define QX_BLOG_DLL_EXPORT QX_DLL_EXPORT_HELPER
#else <span class="comment">// _BUILDING_QX_BLOG</span>
#define QX_BLOG_DLL_EXPORT QX_DLL_IMPORT_HELPER
#endif <span class="comment">// _BUILDING_QX_BLOG</span>
#ifdef _BUILDING_QX_BLOG
#define QX_REGISTER_HPP_QX_BLOG QX_REGISTER_HPP_EXPORT_DLL
#define QX_REGISTER_CPP_QX_BLOG QX_REGISTER_CPP_EXPORT_DLL
#else <span class="comment">// _BUILDING_QX_BLOG</span>
#define QX_REGISTER_HPP_QX_BLOG QX_REGISTER_HPP_IMPORT_DLL
#define QX_REGISTER_CPP_QX_BLOG QX_REGISTER_CPP_IMPORT_DLL
#endif <span class="comment">// _BUILDING_QX_BLOG</span>
#endif <span class="comment">// _QX_BLOG_EXPORT_H_</span>
</span></pre>
</td>
</tr>
</tbody>
</table>
<br><br>
<a name="tuto_5"><u>
<font color="#100D5A">5- Contenu du fichier <i>precompiled.h</i>
:</font>
</u></a><br>
<br>
Il s'agit d'un en-t<>te pr<70>compil<69> (<i>precompiled header</i>) permettant
d'optimiser les temps de compilation du projet. <br>
En effet, <b>QxOrm</b> utilise les techniques de <b>m<EFBFBD>taprogrammation</b> pour
fournir l'ensemble de ses fonctionnalit<69>s. <br>
La m<>taprogrammation <20>tant couteuse en temps de compilation, un
projet C++ se compilera beaucoup plus vite avec un fichier
<i>precompiled.h</i>. <br>
Un seul fichier d'en-t<>te est n<>cessaire pour disposer de l'ensemble des fonctionnalit<69>s de <b>QxOrm</b>
: le fichier <i>QxOrm.h</i>.<br>
<br>
<table border="1" bgcolor="#FFFFFF">
<col>
<tbody>
<tr>
<td title="precompiled.h">
<pre><span class="pre">#ifndef _QX_BLOG_PRECOMPILED_HEADER_H_
#define _QX_BLOG_PRECOMPILED_HEADER_H_
#include <span class="string">&lt;QxOrm.h&gt;</span>
#include <span class="string">"export.h"</span>
#endif <span class="comment">// _QX_BLOG_PRECOMPILED_HEADER_H_</span>
</span></pre>
</td>
</tr>
</tbody>
</table>
<br><br>
<a name="tuto_6"><u>
<font color="#100D5A">6- Contenu des fichiers <i>author.h</i> et
<i>author.cpp</i> (relation <i>one-to-many</i>) :
</font>
</u></a><br>
<br>
Un <i>author</i> est une personne qui peut r<>diger plusieurs <i>blog</i>
: nous allons ainsi montrer comment utiliser la relation de type
<b><i>one-to-many</i></b>. <br>
Au niveau base de donn<6E>es, voici les deux tables qui correspondent : <br>
<br>
<img alt="qxBlog.table.author" src="./resource/qxBlog.table.author.jpg" width="318" height="118"><br>
<br>
Dans le code C++, les propri<72>t<EFBFBD>s de la classe <i>author</i> sont le
sym<79>trique des champs de la table <i>author</i> dans la base de
donn<6E>es. <br>
Donc une instance de la classe <i>author</i> dans le code C++ correspond
<20> une ligne de la table <i>author</i> dans la base de donn<6E>es. <br>
Ce principe permet d'<27>crire du code C++ simple de compr<70>hension et
facile <20> maintenir.<br><br>
Nous ajoutons une m<>thode <20> notre classe <i>author</i> : <i>int age()</i> qui calculera l'<27>ge en fonction
de la
date de naissance envoy<6F>e par la base de donn<6E>es.<br>
Nous <20>crivons <20>galement deux <i>typedef</i> pour repr<70>senter un pointeur (<i>smart-pointer</i>) vers un
objet <i>author</i> ainsi qu'une collection de <i>author</i>.<br>
La classe <i>author</i> a un identifiant de type <i>QString</i> (par d<>faut, un identifiant dans le
contexte <b>QxOrm</b> est de type <i>long</i>) : nous utilisons la macro
<b><i>QX_REGISTER_PRIMARY_KEY(author, QString)</i></b> pour sp<73>cialiser le template.<br>
La classe <i>author</i> s'<27>crit de la fa<66>on suivante :<br>
<br>
<table border="1" bgcolor="#FFFFFF">
<col>
<tbody>
<tr>
<td title="author.h">
<pre><span class="pre">#ifndef _QX_BLOG_AUTHOR_H_
#define _QX_BLOG_AUTHOR_H_
</span><span class="keyword">
class</span> blog<span class="operator">;</span><span class="keyword">
class</span> QX_BLOG_DLL_EXPORT author<span class="operator">
{</span><span class="keyword">
public</span><span class="operator">:</span><span class="comment">
// -- typedef
</span><span class="keyword"> typedef</span> boost<span class="operator">::</span>shared_ptr<span class="operator">&lt;</span>blog<span class="operator">&gt;</span> blog_ptr<span class="operator">;</span><span class="keyword">
typedef</span> std<span class="operator">::</span>vector<span class="operator">&lt;</span>blog_ptr<span class="operator">&gt;</span> list_blog<span class="operator">;</span><span class="comment">
// -- enum
</span><span class="keyword"> enum</span> enum_sex<span class="operator"> {</span> male<span class="operator">,</span> female<span class="operator">,</span> unknown<span class="operator"> };</span><span class="comment">
// -- propri<72>t<EFBFBD>s
</span> QString m_id<span class="operator">;</span>
QString m_name<span class="operator">;</span>
QDate m_birthdate<span class="operator">;</span>
enum_sex m_sex<span class="operator">;</span>
list_blog m_blogX<span class="operator">;</span><span class="comment">
// -- constructeur, destructeur virtuel
</span> author<span class="operator">() :</span> m_id<span class="operator">(</span><span class="int">0</span><span class="operator">),</span> m_sex<span class="operator">(</span>unknown<span class="operator">) { ; }</span><span class="keyword">
virtual</span><span class="operator"> ~</span>author<span class="operator">() { ; }</span><span class="comment">
// -- m<>thodes
</span><span class="type"> int</span> age<span class="operator">()</span><span class="keyword"> const</span><span class="operator">;
};</span>
QX_REGISTER_PRIMARY_KEY<span class="operator">(</span>author<span class="operator">,</span> QString<span class="operator">)</span>
QX_REGISTER_HPP_QX_BLOG<span class="operator">(</span>author<span class="operator">,</span> qx<span class="operator">::</span>trait<span class="operator">::</span>no_base_class_defined<span class="operator">,</span><span class="int"> 0</span><span class="operator">)</span><span class="keyword">
typedef</span> boost<span class="operator">::</span>shared_ptr<span class="operator">&lt;</span>author<span class="operator">&gt;</span> author_ptr<span class="operator">;</span><span class="keyword">
typedef</span> qx<span class="operator">::</span>QxCollection<span class="operator">&lt;</span>QString<span class="operator">,</span> author_ptr<span class="operator">&gt;</span> list_author<span class="operator">;</span><span class="pre">
#endif <span class="comment">// _QX_BLOG_AUTHOR_H_</span>
</span></pre>
</td>
</tr>
</tbody>
</table>
<br>
<table border="1" bgcolor="#FFFFFF">
<col>
<tbody>
<tr>
<td title="author.cpp">
<pre><span class="pre">#include <span class="string">"../include/precompiled.h"</span>
#include <span class="string">"../include/author.h"</span>
#include <span class="string">"../include/blog.h"</span>
#include <span class="string">&lt;QxOrm_Impl.h&gt;</span>
</span>
QX_REGISTER_CPP_QX_BLOG<span class="operator">(</span>author<span class="operator">)</span><span class="keyword">
namespace</span> qx<span class="operator"> {</span><span class="keyword">
template</span><span class="operator"> &lt;&gt;</span><span class="type"> void</span> register_class<span class="operator">(</span>QxClass<span class="operator">&lt;</span>author<span class="operator">&gt; &amp;</span> t<span class="operator">)
{</span>
t<span class="operator">.</span>id<span class="operator">(&amp;</span> author<span class="operator">::</span>m_id<span class="operator">,</span><span class="string"> "author_id"</span><span class="operator">);</span>
t<span class="operator">.</span>data<span class="operator">(&amp;</span> author<span class="operator">::</span>m_name<span class="operator">,</span><span class="string"> "name"</span><span class="operator">);</span>
t<span class="operator">.</span>data<span class="operator">(&amp;</span> author<span class="operator">::</span>m_birthdate<span class="operator">,</span><span class="string"> "birthdate"</span><span class="operator">);</span>
t<span class="operator">.</span>data<span class="operator">(&amp;</span> author<span class="operator">::</span>m_sex<span class="operator">,</span><span class="string"> "sex"</span><span class="operator">);</span>
t<span class="operator">.</span>relationOneToMany<span class="operator">(&amp;</span> author<span class="operator">::</span>m_blogX<span class="operator">,</span><span class="string"> "list_blog"</span><span class="operator">,</span><span class="string"> "author_id"</span><span class="operator">);</span>
t<span class="operator">.</span>fct_0<span class="operator">&lt;</span><span class="type">int</span><span class="operator">&gt;(&amp;</span> author<span class="operator">::</span>age<span class="operator">,</span><span class="string"> "age"</span><span class="operator">);
}}</span><span class="type">
int</span> author<span class="operator">::</span>age<span class="operator">()</span><span class="keyword"> const</span><span class="operator">
{</span><span class="flow">
if</span><span class="operator"> (!</span> m_birthdate<span class="operator">.</span>isValid<span class="operator">()) {</span><span class="flow"> return</span><span class="operator"> -</span><span class="int">1</span><span class="operator">; }</span><span class="flow">
return</span><span class="operator"> (</span>QDate<span class="operator">::</span>currentDate<span class="operator">().</span>year<span class="operator">() -</span> m_birthdate<span class="operator">.</span>year<span class="operator">());
}</span>
</pre>
</td>
</tr>
</tbody>
</table>
<br><br>
<a name="tuto_7"><u>
<font color="#100D5A">7- Contenu des fichiers <i>comment.h</i> et
<i>comment.cpp</i> (relation <i>many-to-one</i>) :
</font>
</u></a><br>
<br>
Un <i>comment</i> est associ<63> <20> un <i>blog</i> et un <i>blog</i> peut
contenir plusieurs <i>comment</i> : nous allons ainsi montrer comment
utiliser la relation de type <b><i>many-to-one</i></b>. <br>
Au niveau base de donn<6E>es, voici les deux tables qui correspondent (nous
reprenons la table <i>blog</i> vue pr<70>c<EFBFBD>demment) : <br>
<br>
<img alt="qxBlog.table.comment" src="./resource/qxBlog.table.comment.jpg" width="335" height="116"><br>
<br>
De m<>me que pour la classe <i>author</i>, nous <20>crivons deux <i>typedef</i>
pour repr<70>senter un pointeur vers un objet <i>comment</i> ainsi qu'une collection de <i>comment</i>.<br>
La classe <i>comment</i> s'<27>crit de la fa<66>on suivante :<br>
<br>
<table border="1" bgcolor="#FFFFFF">
<col>
<tbody>
<tr>
<td title="comment.h">
<pre><span class="pre">#ifndef _QX_BLOG_COMMENT_H_
#define _QX_BLOG_COMMENT_H_
</span><span class="keyword">
class</span> blog<span class="operator">;</span><span class="keyword">
class</span> QX_BLOG_DLL_EXPORT comment<span class="operator">
{</span><span class="keyword">
public</span><span class="operator">:</span><span class="comment">
// -- typedef
</span><span class="keyword"> typedef</span> boost<span class="operator">::</span>shared_ptr<span class="operator">&lt;</span>blog<span class="operator">&gt;</span> blog_ptr<span class="operator">;</span><span class="comment">
// -- propri<72>t<EFBFBD>s
</span><span class="type"> long</span> m_id<span class="operator">;</span>
QString m_text<span class="operator">;</span>
QDateTime m_dt_create<span class="operator">;</span>
blog_ptr m_blog<span class="operator">;</span><span class="comment">
// -- constructeur, destructeur virtuel
</span> comment<span class="operator">() :</span> m_id<span class="operator">(</span><span class="int">0</span><span class="operator">) { ; }</span><span class="keyword">
virtual</span><span class="operator"> ~</span>comment<span class="operator">() { ; }
};</span>
QX_REGISTER_HPP_QX_BLOG<span class="operator">(</span>comment<span class="operator">,</span> qx<span class="operator">::</span>trait<span class="operator">::</span>no_base_class_defined<span class="operator">,</span><span class="int"> 0</span><span class="operator">)</span><span class="keyword">
typedef</span> boost<span class="operator">::</span>shared_ptr<span class="operator">&lt;</span>comment<span class="operator">&gt;</span> comment_ptr<span class="operator">;</span><span class="keyword">
typedef</span> QList<span class="operator">&lt;</span>comment_ptr<span class="operator">&gt;</span> list_comment<span class="operator">;</span><span class="pre">
#endif <span class="comment">// _QX_BLOG_COMMENT_H_</span>
</span></pre>
</td>
</tr>
</tbody>
</table>
<br>
<table border="1" bgcolor="#FFFFFF">
<col>
<tbody>
<tr>
<td title="comment.cpp">
<pre><span class="pre">#include <span class="string">"../include/precompiled.h"</span>
#include <span class="string">"../include/comment.h"</span>
#include <span class="string">"../include/blog.h"</span>
#include <span class="string">&lt;QxOrm_Impl.h&gt;</span>
</span>
QX_REGISTER_CPP_QX_BLOG<span class="operator">(</span>comment<span class="operator">)</span><span class="keyword">
namespace</span> qx<span class="operator"> {</span><span class="keyword">
template</span><span class="operator"> &lt;&gt;</span><span class="type"> void</span> register_class<span class="operator">(</span>QxClass<span class="operator">&lt;</span>comment<span class="operator">&gt; &amp;</span> t<span class="operator">)
{</span>
t<span class="operator">.</span>id<span class="operator">(&amp;</span> comment<span class="operator">::</span>m_id<span class="operator">,</span><span class="string"> "comment_id"</span><span class="operator">);</span>
t<span class="operator">.</span>data<span class="operator">(&amp;</span> comment<span class="operator">::</span>m_text<span class="operator">,</span><span class="string"> "comment_text"</span><span class="operator">);</span>
t<span class="operator">.</span>data<span class="operator">(&amp;</span> comment<span class="operator">::</span>m_dt_create<span class="operator">,</span><span class="string"> "date_creation"</span><span class="operator">);</span>
t<span class="operator">.</span>relationManyToOne<span class="operator">(&amp;</span> comment<span class="operator">::</span>m_blog<span class="operator">,</span><span class="string"> "blog_id"</span><span class="operator">);
}}</span>
</pre>
</td>
</tr>
</tbody>
</table>
<br>
<br>
<a name="tuto_8"><u>
<font color="#100D5A">8- Contenu des fichiers <i>category.h</i> et
<i>category.cpp</i> (relation <i>many-to-many</i>) :
</font>
</u></a><br>
<br>
Une <i>category</i> r<>f<EFBFBD>rence plusieurs <i>blog</i> et un <i>blog</i> peut
appartenir <20> plusieurs <i>category</i> : nous allons ainsi montrer
comment utiliser la relation de type <b><i>many-to-many</i></b>.<br>
Ce type de relation implique une table suppl<70>mentaire dans la base de
donn<6E>es pour stocker la liste des <i>id</i> de chaque c<>t<EFBFBD> des
relations. <br>
Au niveau base de donn<6E>es, voici les trois tables qui correspondent (nous
reprenons la table <i>blog</i> vue pr<70>c<EFBFBD>demment) : <br>
<br>
<img alt="qxBlog.table.category" src="./resource/qxBlog.table.category.jpg" width="464" height="115"><br>
<br>
De m<>me que pour les classes <i>author</i> et <i>comment</i>, nous <20>crivons deux <i>typedef</i>
pour repr<70>senter un pointeur vers un objet <i>category</i> ainsi qu'une collection de
<i>category</i>.<br>
La classe <i>category</i> s'<27>crit de la fa<66>on suivante :<br>
<br>
<table border="1" bgcolor="#FFFFFF">
<col>
<tbody>
<tr>
<td title="category.h">
<pre><span class="pre">#ifndef _QX_BLOG_CATEGORY_H_
#define _QX_BLOG_CATEGORY_H_
</span><span class="keyword">
class</span> blog<span class="operator">;</span><span class="keyword">
class</span> QX_BLOG_DLL_EXPORT category<span class="operator">
{</span><span class="keyword">
public</span><span class="operator">:</span><span class="comment">
// -- typedef
</span><span class="keyword"> typedef</span> boost<span class="operator">::</span>shared_ptr<span class="operator">&lt;</span>blog<span class="operator">&gt;</span> blog_ptr<span class="operator">;</span><span class="keyword">
typedef</span> qx<span class="operator">::</span>QxCollection<span class="operator">&lt;</span><span class="type">long</span><span class="operator">,</span> blog_ptr<span class="operator">&gt;</span> list_blog<span class="operator">;</span><span class="comment">
// -- propri<72>t<EFBFBD>s
</span><span class="type"> long</span> m_id<span class="operator">;</span>
QString m_name<span class="operator">;</span>
QString m_desc<span class="operator">;</span>
list_blog m_blogX<span class="operator">;</span><span class="comment">
// -- constructeur, destructeur virtuel
</span> category<span class="operator">() :</span> m_id<span class="operator">(</span><span class="int">0</span><span class="operator">) { ; }</span><span class="keyword">
virtual</span><span class="operator"> ~</span>category<span class="operator">() { ; }
};</span>
QX_REGISTER_HPP_QX_BLOG<span class="operator">(</span>category<span class="operator">,</span> qx<span class="operator">::</span>trait<span class="operator">::</span>no_base_class_defined<span class="operator">,</span><span class="int"> 0</span><span class="operator">)</span><span class="keyword">
typedef</span> QSharedPointer<span class="operator">&lt;</span>category<span class="operator">&gt;</span> category_ptr<span class="operator">;</span><span class="keyword">
typedef</span> qx<span class="operator">::</span>QxCollection<span class="operator">&lt;</span><span class="type">long</span><span class="operator">,</span> category_ptr<span class="operator">&gt;</span> list_category<span class="operator">;</span><span class="pre">
#endif <span class="comment">// _QX_BLOG_CATEGORY_H_</span>
</span></pre>
</td>
</tr>
</tbody>
</table>
<br>
<table border="1" bgcolor="#FFFFFF">
<col>
<tbody>
<tr>
<td title="category.cpp">
<pre><span class="pre">#include <span class="string">"../include/precompiled.h"</span>
#include <span class="string">"../include/category.h"</span>
#include <span class="string">"../include/blog.h"</span>
#include <span class="string">&lt;QxOrm_Impl.h&gt;</span>
</span>
QX_REGISTER_CPP_QX_BLOG<span class="operator">(</span>category<span class="operator">)</span><span class="keyword">
namespace</span> qx<span class="operator"> {</span><span class="keyword">
template</span><span class="operator"> &lt;&gt;</span><span class="type"> void</span> register_class<span class="operator">(</span>QxClass<span class="operator">&lt;</span>category<span class="operator">&gt; &amp;</span> t<span class="operator">)
{</span>
t<span class="operator">.</span>id<span class="operator">(&amp;</span> category<span class="operator">::</span>m_id<span class="operator">,</span><span class="string"> "category_id"</span><span class="operator">);</span>
t<span class="operator">.</span>data<span class="operator">(&amp;</span> category<span class="operator">::</span>m_name<span class="operator">,</span><span class="string"> "name"</span><span class="operator">);</span>
t<span class="operator">.</span>data<span class="operator">(&amp;</span> category<span class="operator">::</span>m_desc<span class="operator">,</span><span class="string"> "description"</span><span class="operator">);</span>
t<span class="operator">.</span>relationManyToMany<span class="operator">(&amp;</span> category<span class="operator">::</span>m_blogX<span class="operator">,</span><span class="string"> "list_blog"</span><span class="operator">,</span><span class="string"> "category_blog"</span><span class="operator">,</span><span class="string"> "category_id"</span><span class="operator">,</span><span class="string"> "blog_id"</span><span class="operator">);
}}</span>
</pre>
</td>
</tr>
</tbody>
</table>
<br>
<br>
<a name="tuto_9"><u>
<font color="#100D5A">9- Contenu des fichiers <i>blog.h</i> et
<i>blog.cpp</i> (relations <i>one-to-many</i>, <i>many-to-one</i> et <i>many-to-many</i>) :
</font>
</u></a><br>
<br>
Un <i>blog</i> est <20>crit par un <i>author</i>, peut avoir plusieurs
<i>comment</i> et peut <20>tre associ<63> <20> plusieurs <i>category</i>. Cette
classe contient donc trois relations : <b><i>one-to-many</i>,
<i>many-to-one</i> et <i>many-to-many</i></b>.<br>
<br>
<i>Remarque</i> : <b>QxOrm</b> g<>re <20>galement le type de relation <b><i>one-to-one</i></b>
qui est cependant beaucoup moins utilis<69>e que les autres relations. <br>
Un exemple de type de relation <b><i>one-to-one</i></b> est disponible en
annexe de ce tutoriel avec la classe/table <i>person</i> : une
<i>person</i> correspond <20> un <i>author</i>. <br>
<br>
De m<>me que pour les autres classes, nous <20>crivons deux <i>typedef</i>
pour repr<70>senter un pointeur vers un objet <i>blog</i> ainsi qu'une collection de <i>blog</i>.<br>
La classe <i>blog</i> s'<27>crit de la fa<66>on suivante :<br>
<br>
<table border="1" bgcolor="#FFFFFF">
<col>
<tbody>
<tr>
<td title="blog.h">
<pre><span class="pre">#ifndef _QX_BLOG_BLOG_H_
#define _QX_BLOG_BLOG_H_
#include <span class="string">"author.h"</span>
#include <span class="string">"comment.h"</span>
#include <span class="string">"category.h"</span>
</span><span class="keyword">
class</span> QX_BLOG_DLL_EXPORT blog<span class="operator">
{</span><span class="keyword">
public</span><span class="operator">:</span><span class="comment">
// -- propri<72>t<EFBFBD>s
</span><span class="type"> long</span> m_id<span class="operator">;</span>
QString m_text<span class="operator">;</span>
QDateTime m_dt_creation<span class="operator">;</span>
author_ptr m_author<span class="operator">;</span>
list_comment m_commentX<span class="operator">;</span>
list_category m_categoryX<span class="operator">;</span><span class="comment">
// -- constructeur, destructeur virtuel
</span> blog<span class="operator">() :</span> m_id<span class="operator">(</span><span class="int">0</span><span class="operator">) { ; }</span><span class="keyword">
virtual</span><span class="operator"> ~</span>blog<span class="operator">() { ; }
};</span>
QX_REGISTER_HPP_QX_BLOG<span class="operator">(</span>blog<span class="operator">,</span> qx<span class="operator">::</span>trait<span class="operator">::</span>no_base_class_defined<span class="operator">,</span><span class="int"> 0</span><span class="operator">)</span><span class="keyword">
typedef</span> boost<span class="operator">::</span>shared_ptr<span class="operator">&lt;</span>blog<span class="operator">&gt;</span> blog_ptr<span class="operator">;</span><span class="keyword">
typedef</span> std<span class="operator">::</span>vector<span class="operator">&lt;</span>blog_ptr<span class="operator">&gt;</span> list_blog<span class="operator">;</span><span class="pre">
#endif <span class="comment">// _QX_BLOG_BLOG_H_</span>
</span></pre>
</td>
</tr>
</tbody>
</table>
<br>
<table border="1" bgcolor="#FFFFFF">
<col>
<tbody>
<tr>
<td title="blog.cpp">
<pre><span class="pre">#include <span class="string">"../include/precompiled.h"</span>
#include <span class="string">"../include/blog.h"</span>
#include <span class="string">&lt;QxOrm_Impl.h&gt;</span>
</span>
QX_REGISTER_CPP_QX_BLOG<span class="operator">(</span>blog<span class="operator">)</span><span class="keyword">
namespace</span> qx<span class="operator"> {</span><span class="keyword">
template</span><span class="operator"> &lt;&gt;</span><span class="type"> void</span> register_class<span class="operator">(</span>QxClass<span class="operator">&lt;</span>blog<span class="operator">&gt; &amp;</span> t<span class="operator">)
{</span>
t<span class="operator">.</span>id<span class="operator">(&amp;</span> blog<span class="operator">::</span>m_id<span class="operator">,</span><span class="string"> "blog_id"</span><span class="operator">);</span>
t<span class="operator">.</span>data<span class="operator">(&amp;</span> blog<span class="operator">::</span>m_text<span class="operator">,</span><span class="string"> "blog_text"</span><span class="operator">);</span>
t<span class="operator">.</span>data<span class="operator">(&amp;</span> blog<span class="operator">::</span>m_dt_creation<span class="operator">,</span><span class="string"> "date_creation"</span><span class="operator">);</span>
t<span class="operator">.</span>relationManyToOne<span class="operator">(&amp;</span> blog<span class="operator">::</span>m_author<span class="operator">,</span><span class="string"> "author_id"</span><span class="operator">);</span>
t<span class="operator">.</span>relationOneToMany<span class="operator">(&amp;</span> blog<span class="operator">::</span>m_commentX<span class="operator">,</span><span class="string"> "list_comment"</span><span class="operator">,</span><span class="string"> "blog_id"</span><span class="operator">);</span>
t<span class="operator">.</span>relationManyToMany<span class="operator">(&amp;</span> blog<span class="operator">::</span>m_categoryX<span class="operator">,</span><span class="string"> "list_category"</span><span class="operator">,</span><span class="string"> "category_blog"</span><span class="operator">,</span><span class="string"> "blog_id"</span><span class="operator">,</span><span class="string"> "category_id"</span><span class="operator">);
}}</span>
</pre>
</td>
</tr>
</tbody>
</table>
<br>
<br>
<a name="tuto_10"><u>
<font color="#100D5A">10- Contenu du fichier <i>main.cpp</i>
:</font>
</u></a><br>
<br>
<b>QxOrm</b> permet de communiquer de mani<6E>re simple et performante avec de
nombreuses bases de donn<6E>es (<a
href="http://qt.developpez.com/doc/latest/sql-driver.html#supported-databases" target="_blank">voir la
liste des bases de donn<6E>es support<72>es sur le site de Qt</a>).<br>
Il est recommand<6E> d'utiliser un pilote sp<73>cifique <20> la base de donn<6E>es afin d'optimiser les performances
: le pilote <i>QODBC</i>, bien que g<>n<EFBFBD>rique et permettant
de s'interfacer avec la plupart des bases de donn<6E>es du march<63>, sera moins performant qu'un pilote natif
(par exemple, le pilote <i>QMYSQL</i> pour une base de donn<6E>es <i>MySQL</i>).<br>
<br>
Outre la <font style="background-color:yellow"><b>persistance</b></font>, <b>QxOrm</b> poss<73>de <20>galement
d'autres
fonctionnalit<69>s int<6E>ressantes li<6C>es <20> la gestion des donn<6E>es :
<ul>
<li>
la <font style="background-color:yellow"><b>s<EFBFBD>rialisation</b></font> automatique des donn<6E>es ou
collections de donn<6E>es au
format binaire, XML et JSON ;
</li>
<li>la <font style="background-color:yellow"><b>r<EFBFBD>flexion</b></font> (ou <font
style="background-color:yellow"><b>introspection</b></font>) permettant d'acc<63>der <20> la
d<>finition des classes param<61>tr<74>es dans le contexte QxOrm ainsi que
l'appel automatique des m<>thodes de classes.</li>
</ul>
<br>
<table border="1" bgcolor="#FFFFFF">
<col>
<tbody>
<tr>
<td title="main.cpp">
<pre><span class="pre">#include <span class="string">"../include/precompiled.h"</span>
#include <span class="string">&lt;QtGui/qapplication.h&gt;</span>
#include <span class="string">"../include/blog.h"</span>
#include <span class="string">"../include/author.h"</span>
#include <span class="string">"../include/comment.h"</span>
#include <span class="string">"../include/category.h"</span>
#include <span class="string">&lt;QxOrm_Impl.h&gt;</span>
</span><span class="type">
int</span><span class="keyword"> main</span><span class="operator">(</span><span class="type">int</span> argc<span class="operator">,</span><span class="type"> char</span><span class="operator"> *</span> argv<span class="operator">[])
{</span><span class="comment">
// Initialisation de l'objet application du framework Qt
</span> QApplication app<span class="operator">(</span>argc<span class="operator">,</span> argv<span class="operator">);</span><span class="comment">
// Param<61>tres de connexion <20> la base de donn<6E>es
</span> qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-&gt;</span>setDriverName<span class="operator">(</span><span class="string">"QSQLITE"</span><span class="operator">);</span>
qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-&gt;</span>setDatabaseName<span class="operator">(</span><span class="string">"./qxBlog.sqlite"</span><span class="operator">);</span>
qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-&gt;</span>setHostName<span class="operator">(</span><span class="string">"localhost"</span><span class="operator">);</span>
qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-&gt;</span>setUserName<span class="operator">(</span><span class="string">"root"</span><span class="operator">);</span>
qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-&gt;</span>setPassword<span class="operator">(</span><span class="string">""</span><span class="operator">);</span><span class="comment">
// Vide toutes les tables de la base de donn<6E>es
</span> QSqlError daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>delete_all<span class="operator">&lt;</span>author<span class="operator">&gt;();</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>delete_all<span class="operator">&lt;</span>comment<span class="operator">&gt;();</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>delete_all<span class="operator">&lt;</span>category<span class="operator">&gt;();</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>delete_all<span class="operator">&lt;</span>blog<span class="operator">&gt;();</span><span class="comment">
// Cr<43>ation d'une liste de trois 'author'
</span> author_ptr author_1<span class="operator">;</span> author_1<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> author<span class="operator">());</span>
author_ptr author_2<span class="operator">;</span> author_2<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> author<span class="operator">());</span>
author_ptr author_3<span class="operator">;</span> author_3<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> author<span class="operator">());</span>
author_1<span class="operator">-&gt;</span>m_id<span class="operator"> =</span><span class="string"> "author_id_1"</span><span class="operator">;</span> author_1<span class="operator">-&gt;</span>m_name<span class="operator"> =</span><span class="string"> "author_1"</span><span class="operator">;</span>
author_1<span class="operator">-&gt;</span>m_sex<span class="operator"> =</span> author<span class="operator">::</span>male<span class="operator">;</span> author_1<span class="operator">-&gt;</span>m_birthdate<span class="operator"> =</span> QDate<span class="operator">::</span>currentDate<span class="operator">();</span>
author_2<span class="operator">-&gt;</span>m_id<span class="operator"> =</span><span class="string"> "author_id_2"</span><span class="operator">;</span> author_2<span class="operator">-&gt;</span>m_name<span class="operator"> =</span><span class="string"> "author_2"</span><span class="operator">;</span>
author_2<span class="operator">-&gt;</span>m_sex<span class="operator"> =</span> author<span class="operator">::</span>female<span class="operator">;</span> author_2<span class="operator">-&gt;</span>m_birthdate<span class="operator"> =</span> QDate<span class="operator">::</span>currentDate<span class="operator">();</span>
author_3<span class="operator">-&gt;</span>m_id<span class="operator"> =</span><span class="string"> "author_id_3"</span><span class="operator">;</span> author_3<span class="operator">-&gt;</span>m_name<span class="operator"> =</span><span class="string"> "author_3"</span><span class="operator">;</span>
author_3<span class="operator">-&gt;</span>m_sex<span class="operator"> =</span> author<span class="operator">::</span>female<span class="operator">;</span> author_3<span class="operator">-&gt;</span>m_birthdate<span class="operator"> =</span> QDate<span class="operator">::</span>currentDate<span class="operator">();</span>
list_author authorX<span class="operator">;</span>
authorX<span class="operator">.</span>insert<span class="operator">(</span>author_1<span class="operator">-&gt;</span>m_id<span class="operator">,</span> author_1<span class="operator">);</span>
authorX<span class="operator">.</span>insert<span class="operator">(</span>author_2<span class="operator">-&gt;</span>m_id<span class="operator">,</span> author_2<span class="operator">);</span>
authorX<span class="operator">.</span>insert<span class="operator">(</span>author_3<span class="operator">-&gt;</span>m_id<span class="operator">,</span> author_3<span class="operator">);</span><span class="comment">
// Insertion de la liste des trois 'author' dans la base de donn<6E>es
</span> daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>authorX<span class="operator">);</span>
qAssert<span class="operator">(</span>qx<span class="operator">::</span>dao<span class="operator">::</span>count<span class="operator">&lt;</span>author<span class="operator">&gt;() ==</span><span class="int"> 3</span><span class="operator">);</span><span class="comment">
// Cr<43>ation d'un clone de l'instance 'author_id_2'
</span> author_ptr author_clone<span class="operator"> =</span> qx<span class="operator">::</span>clone<span class="operator">(*</span> author_2<span class="operator">);</span>
qAssert<span class="operator">(</span>author_clone<span class="operator">-&gt;</span>m_id<span class="operator"> ==</span><span class="string"> "author_id_2"</span><span class="operator">);</span>
qAssert<span class="operator">(</span>author_clone<span class="operator">-&gt;</span>m_sex<span class="operator"> ==</span> author<span class="operator">::</span>female<span class="operator">);</span><span class="comment">
// Construit une requ<71>te pour r<>cup<75>rer uniquement les 'author' de type 'female', soit 'author_id_2' et 'author_id_3'
</span> qx<span class="operator">::</span>QxSqlQuery query<span class="operator">(</span><span class="string">"WHERE author.sex = :sex"</span><span class="operator">);</span>
query<span class="operator">.</span>bind<span class="operator">(</span><span class="string">":sex"</span><span class="operator">,</span> author<span class="operator">::</span>female<span class="operator">);</span>
list_author list_of_female_author<span class="operator">;</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>fetch_by_query<span class="operator">(</span>query<span class="operator">,</span> list_of_female_author<span class="operator">);</span>
qAssert<span class="operator">(</span>list_of_female_author<span class="operator">.</span>count<span class="operator">() ==</span><span class="int"> 2</span><span class="operator">);</span><span class="comment">
// Affiche la liste des 'author' de type 'female' dans un flux XML (ou JSON)
</span> qx<span class="operator">::</span>dump<span class="operator">(</span>list_of_female_author<span class="operator">);</span><span class="comment">
// Cr<43>ation de trois 'category' pour classer les 'blog'
</span> category_ptr category_1<span class="operator"> =</span> category_ptr<span class="operator">(</span><span class="keyword">new</span> category<span class="operator">());</span>
category_ptr category_2<span class="operator"> =</span> category_ptr<span class="operator">(</span><span class="keyword">new</span> category<span class="operator">());</span>
category_ptr category_3<span class="operator"> =</span> category_ptr<span class="operator">(</span><span class="keyword">new</span> category<span class="operator">());</span>
category_1<span class="operator">-&gt;</span>m_name<span class="operator"> =</span><span class="string"> "category_1"</span><span class="operator">;</span> category_1<span class="operator">-&gt;</span>m_desc<span class="operator"> =</span><span class="string"> "desc_1"</span><span class="operator">;</span>
category_2<span class="operator">-&gt;</span>m_name<span class="operator"> =</span><span class="string"> "category_2"</span><span class="operator">;</span> category_2<span class="operator">-&gt;</span>m_desc<span class="operator"> =</span><span class="string"> "desc_2"</span><span class="operator">;</span>
category_3<span class="operator">-&gt;</span>m_name<span class="operator"> =</span><span class="string"> "category_3"</span><span class="operator">;</span> category_3<span class="operator">-&gt;</span>m_desc<span class="operator"> =</span><span class="string"> "desc_3"</span><span class="operator">;
{</span><span class="comment"> // Ouverture d'un 'scope' pour g<>rer la destruction d'une connexion temporaire <20> la base de donn<6E>es
// Cr<43>ation d'une connexion temporaire <20> la base de donn<6E>es et ouverture d'une transaction
</span> QSqlDatabase db<span class="operator"> =</span> qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getDatabase<span class="operator">();</span><span class="type">
bool</span> bCommit<span class="operator"> =</span> db<span class="operator">.</span>transaction<span class="operator">();</span><span class="comment">
// Insertion de trois 'category' dans la base de donn<6E>es en utilisant la connexion temporaire 'db'
</span> daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>category_1<span class="operator">, (&amp;</span> db<span class="operator">));</span> bCommit<span class="operator"> = (</span>bCommit<span class="operator"> &amp;&amp; !</span> daoError<span class="operator">.</span>isValid<span class="operator">());</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>category_2<span class="operator">, (&amp;</span> db<span class="operator">));</span> bCommit<span class="operator"> = (</span>bCommit<span class="operator"> &amp;&amp; !</span> daoError<span class="operator">.</span>isValid<span class="operator">());</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>category_3<span class="operator">, (&amp;</span> db<span class="operator">));</span> bCommit<span class="operator"> = (</span>bCommit<span class="operator"> &amp;&amp; !</span> daoError<span class="operator">.</span>isValid<span class="operator">());</span>
qAssert<span class="operator">(</span>bCommit<span class="operator">);</span>
qAssert<span class="operator">(</span>category_1<span class="operator">-&gt;</span>m_id<span class="operator"> !=</span><span class="int"> 0</span><span class="operator">);</span>
qAssert<span class="operator">(</span>category_2<span class="operator">-&gt;</span>m_id<span class="operator"> !=</span><span class="int"> 0</span><span class="operator">);</span>
qAssert<span class="operator">(</span>category_3<span class="operator">-&gt;</span>m_id<span class="operator"> !=</span><span class="int"> 0</span><span class="operator">);</span><span class="comment">
// Fin de la transaction =&gt; 'commit' ou 'rollback' en cas d'erreur
</span><span class="flow"> if</span><span class="operator"> (</span>bCommit<span class="operator">) {</span> db<span class="operator">.</span>commit<span class="operator">(); }</span><span class="flow">
else</span><span class="operator"> {</span> db<span class="operator">.</span>rollback<span class="operator">(); }
}</span><span class="comment"> // Fermeture du 'scope' : l'instance 'db' est d<>truite
// Cr<43>ation d'un 'blog' <20> partir du nom de la classe (design pattern 'factory')
</span> boost<span class="operator">::</span>any blog_any<span class="operator"> =</span> qx<span class="operator">::</span>create<span class="operator">(</span><span class="string">"blog"</span><span class="operator">);</span>
blog_ptr blog_1<span class="operator"> =</span> boost<span class="operator">::</span>any_cast<span class="operator">&lt;</span>blog_ptr<span class="operator">&gt;(</span>blog_any<span class="operator">);</span>
blog_1<span class="operator">-&gt;</span>m_text<span class="operator"> =</span><span class="string"> "blog_text_1"</span><span class="operator">;</span>
blog_1<span class="operator">-&gt;</span>m_dt_creation<span class="operator"> =</span> QDateTime<span class="operator">::</span>currentDateTime<span class="operator">();</span>
blog_1<span class="operator">-&gt;</span>m_author<span class="operator"> =</span> author_1<span class="operator">;</span><span class="comment">
// Insertion de 'blog_1' dans la base de donn<6E>es avec la m<>thode 'save()'
</span> daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>save<span class="operator">(</span>blog_1<span class="operator">);</span><span class="comment">
// Modification des propri<72>t<EFBFBD>s de 'blog_1' et mise <20> jour dans la base de donn<6E>es
</span> blog_1<span class="operator">-&gt;</span>m_text<span class="operator"> =</span><span class="string"> "update blog_text_1"</span><span class="operator">;</span>
blog_1<span class="operator">-&gt;</span>m_author<span class="operator"> =</span> author_2<span class="operator">;</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>save<span class="operator">(</span>blog_1<span class="operator">);</span><span class="comment">
// Ajoute deux commentaires <20> 'blog_1'
</span> comment_ptr comment_1<span class="operator">;</span> comment_1<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> comment<span class="operator">());</span>
comment_ptr comment_2<span class="operator">;</span> comment_2<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> comment<span class="operator">());</span>
comment_1<span class="operator">-&gt;</span>m_text<span class="operator"> =</span><span class="string"> "comment_1 text"</span><span class="operator">;</span>
comment_1<span class="operator">-&gt;</span>m_dt_create<span class="operator"> =</span> QDateTime<span class="operator">::</span>currentDateTime<span class="operator">();</span>
comment_1<span class="operator">-&gt;</span>m_blog<span class="operator"> =</span> blog_1<span class="operator">;</span>
comment_2<span class="operator">-&gt;</span>m_text<span class="operator"> =</span><span class="string"> "comment_2 text"</span><span class="operator">;</span>
comment_2<span class="operator">-&gt;</span>m_dt_create<span class="operator"> =</span> QDateTime<span class="operator">::</span>currentDateTime<span class="operator">();</span>
comment_2<span class="operator">-&gt;</span>m_blog<span class="operator"> =</span> blog_1<span class="operator">;</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>comment_1<span class="operator">);</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>comment_2<span class="operator">);</span>
qAssert<span class="operator">(</span>qx<span class="operator">::</span>dao<span class="operator">::</span>count<span class="operator">&lt;</span>comment<span class="operator">&gt;() ==</span><span class="int"> 2</span><span class="operator">);</span><span class="comment">
// Associe deux 'category' <20> 'blog_1' =&gt; n<>cessite une 3<>me table pour la relation 'many-to-many'
</span> blog_1<span class="operator">-&gt;</span>m_categoryX<span class="operator">.</span>insert<span class="operator">(</span>category_1<span class="operator">-&gt;</span>m_id<span class="operator">,</span> category_1<span class="operator">);</span>
blog_1<span class="operator">-&gt;</span>m_categoryX<span class="operator">.</span>insert<span class="operator">(</span>category_3<span class="operator">-&gt;</span>m_id<span class="operator">,</span> category_3<span class="operator">);</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>save_with_relation<span class="operator">(</span><span class="string">"list_category"</span><span class="operator">,</span> blog_1<span class="operator">);</span><span class="comment">
// R<>cup<75>re avec une seule m<>thode 'blog_1' et toutes ses relations dans la base de donn<6E>es
</span> blog_ptr blog_tmp<span class="operator">;</span> blog_tmp<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> blog<span class="operator">());</span>
blog_tmp<span class="operator">-&gt;</span>m_id<span class="operator"> =</span> blog_1<span class="operator">-&gt;</span>m_id<span class="operator">;</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>fetch_by_id_with_all_relation<span class="operator">(</span>blog_tmp<span class="operator">);</span>
qAssert<span class="operator">(</span>blog_tmp<span class="operator">-&gt;</span>m_commentX<span class="operator">.</span>count<span class="operator">() ==</span><span class="int"> 2</span><span class="operator">);</span>
qAssert<span class="operator">(</span>blog_tmp<span class="operator">-&gt;</span>m_categoryX<span class="operator">.</span>count<span class="operator">() ==</span><span class="int"> 2</span><span class="operator">);</span>
qAssert<span class="operator">(</span>blog_tmp<span class="operator">-&gt;</span>m_text<span class="operator"> ==</span><span class="string"> "update blog_text_1"</span><span class="operator">);</span>
qAssert<span class="operator">(</span>blog_tmp<span class="operator">-&gt;</span>m_author<span class="operator"> &amp;&amp;</span> blog_tmp<span class="operator">-&gt;</span>m_author<span class="operator">-&gt;</span>m_id<span class="operator"> ==</span><span class="string"> "author_id_2"</span><span class="operator">);</span><span class="comment">
// Affiche 'blog_tmp' provenant de la base de donn<6E>es dans un flux XML (ou JSON)
</span> qx<span class="operator">::</span>dump<span class="operator">(</span>blog_tmp<span class="operator">);</span><span class="comment">
// Invoque la m<>thode 'age()' de la classe 'author' par le m<>canisme de r<>flexion (ou introspection)
</span> qx_bool bInvokeOk<span class="operator"> =</span> qx<span class="operator">::</span>QxClassX<span class="operator">::</span>invoke<span class="operator">(</span><span class="string">"author"</span><span class="operator">,</span><span class="string"> "age"</span><span class="operator">,</span> author_1<span class="operator">);</span>
qAssert<span class="operator">(</span>bInvokeOk<span class="operator">);</span><span class="flow">
return</span><span class="int"> 0</span><span class="operator">;
}</span>
</pre>
</td>
</tr>
</tbody>
</table>
<br><br>
<a href="./resource/qxBlog.main.exec.result.txt">Voici les traces g<>n<EFBFBD>r<EFBFBD>es apr<70>s ex<65>cution du programme
<b>qxBlog</b> :</a><br>
<br>
<div style="width:900px; height:500px; overflow:auto; background-color:white">
<pre>
[QxOrm] qx::QxSqlDatabase : create new database connection in thread '4456' with key '{e986c95d-1cb0-4368-ad9c-3dd4ccd20b84}'
[QxOrm] sql query (93 ms) : DELETE FROM author
[QxOrm] sql query (63 ms) : DELETE FROM comment
[QxOrm] sql query (94 ms) : DELETE FROM category
[QxOrm] sql query (78 ms) : DELETE FROM blog
[QxOrm] sql query (62 ms) : INSERT INTO author (author_id, name, birthdate, sex) VALUES (:author_id, :name, :birthdate, :sex)
[QxOrm] sql query (0 ms) : SELECT COUNT(*) FROM author
[QxOrm] sql query (0 ms) : SELECT author.author_id AS author_author_id_0, author.name AS author_name_0, author.birthdate AS author_birthdate_0, author.sex AS author_sex_0 FROM author WHERE author.sex = :sex
[QxOrm] start dump 'qx::QxCollection&lt;QString, boost::shared_ptr&lt;author&gt;&gt;'
&lt;qx.QxCollection-QString_boost.shared_ptr-author-- class_id="0" tracking_level="0" version="0"&gt;
&lt;count&gt;2&lt;/count&gt;
&lt;item class_id="1" tracking_level="0" version="0"&gt;
&lt;first class_id="2" tracking_level="0" version="0"&gt;author_id_2&lt;/first&gt;
&lt;second class_id="3" tracking_level="0" version="1"&gt;
&lt;px class_id="4" tracking_level="1" version="0" object_id="_0"&gt;
&lt;author_id&gt;author_id_2&lt;/author_id&gt;
&lt;name&gt;author_2&lt;/name&gt;
&lt;birthdate class_id="5" tracking_level="0" version="0"&gt;20100409&lt;/birthdate&gt;
&lt;sex&gt;1&lt;/sex&gt;
&lt;list_blog class_id="6" tracking_level="0" version="0"&gt;
&lt;count&gt;0&lt;/count&gt;
&lt;item_version&gt;1&lt;/item_version&gt;
&lt;/list_blog&gt;
&lt;/px&gt;
&lt;/second&gt;
&lt;/item&gt;
&lt;item&gt;
&lt;first&gt;author_id_3&lt;/first&gt;
&lt;second&gt;
&lt;px class_id_reference="4" object_id="_1"&gt;
&lt;author_id&gt;author_id_3&lt;/author_id&gt;
&lt;name&gt;author_3&lt;/name&gt;
&lt;birthdate&gt;20100409&lt;/birthdate&gt;
&lt;sex&gt;1&lt;/sex&gt;
&lt;list_blog&gt;
&lt;count&gt;0&lt;/count&gt;
&lt;item_version&gt;1&lt;/item_version&gt;
&lt;/list_blog&gt;
&lt;/px&gt;
&lt;/second&gt;
&lt;/item&gt;
&lt;/qx.QxCollection-QString_boost.shared_ptr-author--&gt;
[QxOrm] end dump 'qx::QxCollection&lt;QString, boost::shared_ptr&lt;author&gt;&gt;'
[QxOrm] sql query (0 ms) : INSERT INTO category (name, description) VALUES (:name, :description)
[QxOrm] sql query (0 ms) : INSERT INTO category (name, description) VALUES (:name, :description)
[QxOrm] sql query (0 ms) : INSERT INTO category (name, description) VALUES (:name, :description)
[QxOrm] sql query (0 ms) : INSERT INTO blog (blog_text, date_creation, author_id) VALUES (:blog_text, :date_creation, :author_id)
[QxOrm] sql query (0 ms) : SELECT blog.blog_id AS blog_blog_id_0 FROM blog WHERE blog_blog_id_0 = :blog_id
[QxOrm] sql query (0 ms) : UPDATE blog SET blog_id = :blog_id, blog_text = :blog_text, date_creation = :date_creation, author_id = :author_id WHERE blog_id = :blog_id_bis
[QxOrm] sql query (78 ms) : INSERT INTO comment (comment_text, date_creation, blog_id) VALUES (:comment_text, :date_creation, :blog_id)
[QxOrm] sql query (78 ms) : INSERT INTO comment (comment_text, date_creation, blog_id) VALUES (:comment_text, :date_creation, :blog_id)
[QxOrm] sql query (0 ms) : SELECT COUNT(*) FROM comment
[QxOrm] sql query (0 ms) : SELECT blog.blog_id AS blog_blog_id_0 FROM blog WHERE blog_blog_id_0 = :blog_id
[QxOrm] sql query (0 ms) : UPDATE blog SET blog_id = :blog_id, blog_text = :blog_text, date_creation = :date_creation, author_id = :author_id WHERE blog_id = :blog_id_bis
[QxOrm] sql query (0 ms) : SELECT category.category_id AS category_category_id_0 FROM category WHERE category_category_id_0 = :category_id
[QxOrm] sql query (0 ms) : UPDATE category SET category_id = :category_id, name = :name, description = :description WHERE category_id = :category_id_bis
[QxOrm] sql query (0 ms) : SELECT category.category_id AS category_category_id_0 FROM category WHERE category_category_id_0 = :category_id
[QxOrm] sql query (0 ms) : UPDATE category SET category_id = :category_id, name = :name, description = :description WHERE category_id = :category_id_bis
[QxOrm] sql query (extra-table) : DELETE FROM category_blog WHERE category_blog.blog_id = :blog_id
[QxOrm] sql query (extra-table) : INSERT INTO category_blog (blog_id, category_id) VALUES (:blog_id, :category_id)
[QxOrm] sql query (0 ms) : SELECT blog.blog_id AS blog_blog_id_0, blog.blog_text AS blog_blog_text_0, blog.date_creation AS blog_date_creation_0, blog.author_id AS blog_author_id_0, author_1.author_id AS author_1_author_id_0, author_1.name AS author_1_name_0, author_1.birthdate AS author_1_birthdate_0, author_1.sex AS author_1_sex_0, comment_2.comment_id AS comment_2_comment_id_0, comment_2.blog_id AS comment_2_blog_id_0, comment_2.comment_text AS comment_2_comment_text_0, comment_2.date_creation AS comment_2_date_creation_0, category_3.category_id AS category_3_category_id_0, category_3.name AS category_3_name_0, category_3.description AS category_3_description_0 FROM blog LEFT OUTER JOIN author author_1 ON author_1_author_id_0 = blog_author_id_0 LEFT OUTER JOIN comment comment_2 ON comment_2_blog_id_0 = blog_blog_id_0 LEFT OUTER JOIN category_blog ON blog_blog_id_0 = category_blog.blog_id LEFT OUTER JOIN category category_3 ON category_blog.category_id = category_3_category_id_0 WHERE blog_blog_id_0 = :blog_id
[QxOrm] start dump 'boost::shared_ptr&lt;blog&gt;'
&lt;boost.shared_ptr-blog- class_id="0" tracking_level="0" version="1"&gt;
&lt;px class_id="1" tracking_level="1" version="0" object_id="_0"&gt;
&lt;blog_id&gt;113&lt;/blog_id&gt;
&lt;blog_text class_id="2" tracking_level="0" version="0"&gt;update blog_text_1&lt;/blog_text&gt;
&lt;date_creation class_id="3" tracking_level="0" version="0"&gt;20100409162612000&lt;/date_creation&gt;
&lt;author_id class_id="4" tracking_level="0" version="1"&gt;
&lt;px class_id="5" tracking_level="1" version="0" object_id="_1"&gt;
&lt;author_id&gt;author_id_2&lt;/author_id&gt;
&lt;name&gt;author_2&lt;/name&gt;
&lt;birthdate class_id="6" tracking_level="0" version="0"&gt;20100409&lt;/birthdate&gt;
&lt;sex&gt;1&lt;/sex&gt;
&lt;list_blog class_id="7" tracking_level="0" version="0"&gt;
&lt;count&gt;0&lt;/count&gt;
&lt;item_version&gt;1&lt;/item_version&gt;
&lt;/list_blog&gt;
&lt;/px&gt;
&lt;/author_id&gt;
&lt;list_comment class_id="8" tracking_level="0" version="0"&gt;
&lt;count&gt;2&lt;/count&gt;
&lt;item class_id="9" tracking_level="0" version="1"&gt;
&lt;px class_id="10" tracking_level="1" version="0" object_id="_2"&gt;
&lt;comment_id&gt;209&lt;/comment_id&gt;
&lt;comment_text&gt;comment_1 text&lt;/comment_text&gt;
&lt;date_creation&gt;20100409162612000&lt;/date_creation&gt;
&lt;blog_id&gt;
&lt;px class_id_reference="1" object_id="_3"&gt;
&lt;blog_id&gt;113&lt;/blog_id&gt;
&lt;blog_text&gt;&lt;/blog_text&gt;
&lt;date_creation&gt;&lt;/date_creation&gt;
&lt;author_id&gt;
&lt;px class_id="-1"&gt;&lt;/px&gt;
&lt;/author_id&gt;
&lt;list_comment&gt;
&lt;count&gt;0&lt;/count&gt;
&lt;/list_comment&gt;
&lt;list_category class_id="11" tracking_level="0" version="0"&gt;
&lt;count&gt;0&lt;/count&gt;
&lt;/list_category&gt;
&lt;/px&gt;
&lt;/blog_id&gt;
&lt;/px&gt;
&lt;/item&gt;
&lt;item&gt;
&lt;px class_id_reference="10" object_id="_4"&gt;
&lt;comment_id&gt;210&lt;/comment_id&gt;
&lt;comment_text&gt;comment_2 text&lt;/comment_text&gt;
&lt;date_creation&gt;20100409162612000&lt;/date_creation&gt;
&lt;blog_id&gt;
&lt;px class_id_reference="1" object_id="_5"&gt;
&lt;blog_id&gt;113&lt;/blog_id&gt;
&lt;blog_text&gt;&lt;/blog_text&gt;
&lt;date_creation&gt;&lt;/date_creation&gt;
&lt;author_id&gt;
&lt;px class_id="-1"&gt;&lt;/px&gt;
&lt;/author_id&gt;
&lt;list_comment&gt;
&lt;count&gt;0&lt;/count&gt;
&lt;/list_comment&gt;
&lt;list_category&gt;
&lt;count&gt;0&lt;/count&gt;
&lt;/list_category&gt;
&lt;/px&gt;
&lt;/blog_id&gt;
&lt;/px&gt;
&lt;/item&gt;
&lt;/list_comment&gt;
&lt;list_category&gt;
&lt;count&gt;2&lt;/count&gt;
&lt;item class_id="12" tracking_level="0" version="0"&gt;
&lt;first&gt;355&lt;/first&gt;
&lt;second class_id="13" tracking_level="0" version="0"&gt;
&lt;qt_shared_ptr class_id="14" tracking_level="1" version="0" object_id="_6"&gt;
&lt;category_id&gt;355&lt;/category_id&gt;
&lt;name&gt;category_1&lt;/name&gt;
&lt;description&gt;desc_1&lt;/description&gt;
&lt;list_blog class_id="15" tracking_level="0" version="0"&gt;
&lt;count&gt;0&lt;/count&gt;
&lt;/list_blog&gt;
&lt;/qt_shared_ptr&gt;
&lt;/second&gt;
&lt;/item&gt;
&lt;item&gt;
&lt;first&gt;357&lt;/first&gt;
&lt;second&gt;
&lt;qt_shared_ptr class_id_reference="14" object_id="_7"&gt;
&lt;category_id&gt;357&lt;/category_id&gt;
&lt;name&gt;category_3&lt;/name&gt;
&lt;description&gt;desc_3&lt;/description&gt;
&lt;list_blog&gt;
&lt;count&gt;0&lt;/count&gt;
&lt;/list_blog&gt;
&lt;/qt_shared_ptr&gt;
&lt;/second&gt;
&lt;/item&gt;
&lt;/list_category&gt;
&lt;/px&gt;
&lt;/boost.shared_ptr-blog-&gt;
[QxOrm] end dump 'boost::shared_ptr&lt;blog&gt;'
</pre>
</div>
<br><br>
<i>Remarque importante</i> : <b>QxOrm</b> n'a pas pour objectif de 'cacher' le code SQL (par
d<>faut toutes les requ<71>tes sont trac<61>es). M<>me si <b>QxOrm</b> simplifie
<20>norm<72>ment le code C++ et optimise ainsi les temps de d<>veloppement et
de maintenance d'un produit, il est tr<74>s important d'avoir de bonnes
connaissances SQL.<br>
<b>QxOrm</b> ne r<>soudra pas toutes les probl<62>matiques li<6C>es aux bases de
donn<6E>es (par exemple, jointure limit<69>e <20> deux tables dans une m<>me requ<71>te), il sera alors n<>cessaire
d'utiliser directement le module
<a href="http://qt.developpez.com/doc/latest/sql-programming.html" target="_blank"><i>QtSql</i></a> de Qt
en <20>crivant soi-m<>me les requ<71>tes SQL ou les proc<6F>dures stock<63>es.<br>
Enfin, il faut <20>tre extr<74>mement vigilant au nombre de requ<71>tes
effectu<74>es entre le programme C++ et la base de donn<6E>es : un trop grand
nombre d'appels <20> la base de donn<6E>es peut d<>t<EFBFBD>riorer les performances
d'une application. Il est important de ma<6D>triser la notion de
<i>relations entre les classes</i> ou bien de <i>jointures pour les tables d'une base de donn<6E>es</i> (<a
href="http://www.codeproject.com/Articles/102647/Select-Nplus1-Problem-How-to-Decrease-Your-ORM-Per.aspx"
target="_blank">voir le syndrome <i>n+1 SELECT</i> que l'on peut
rencontrer avec <i>Hibernate</i> ou tout autre ORM</a>).<br>
<br>
Pour plus d'informations sur le langage SQL, regardez l'excellent site de <a
href="http://sqlpro.developpez.com/" target="_blank">Fr<EFBFBD>d<EFBFBD>ric Brouart</a>.<br>
<br>
<i>Autre remarque</i> : il est important de signaler que les m<>thodes <i>void
register_class(...)</i> sont appel<65>es automatiquement
et lorsque c'est n<>cessaire par la biblioth<74>que <b>QxOrm</b>. <br>
Par rapport <20> d'autres biblioth<74>ques qui n<>cessitent un appel pour
enregistrer les types de chaque classe, <b>QxOrm</b> permet un enregistrement
automatique des classes, ce qui simplifie encore un peu plus le
d<>veloppement d'applications.<br>
<br>
<br>
<a name="tuto_11"><u>
<font color="#100D5A">11- Annexe - exemple de relation <i>one-to-one</i>
avec la classe <i>person</i> :</font>
</u></a><br>
<br>
Ajoutons <20> notre projet la classe <i>person</i> (fichiers <i>person.h</i> et
<i>person.cpp</i>) : une <i>person</i> correspond <20> un <i>author</i> dans la base de
donn<6E>es.<br> Ils partagent donc le m<>me identifiant, c'est ce qu'on
appelle une relation de type <b><i>one-to-one</i></b>. <br>
Voici les deux tables de notre base de donn<6E>es (nous reprenons la table
<i>author</i> vue pr<70>c<EFBFBD>demment) : <br><br>
<img alt="qxBlog.table.person" src="resource/qxBlog.table.person.jpg" width="279" height="118"><br>
<br>
<i>Remarque</i> : nous ajoutons <20> la table <i>person</i> le champ <i>mother_id</i>. Nous pouvons
ainsi conna<6E>tre la m<>re (de type <i>person</i>) associ<63>e <20> une <i>person</i>, ce
qui correspond <20> une relation <i>many-to-one</i> sur la m<>me table <i>person</i>.
De plus, si une <i>person</i> est une m<>re, nous pouvons conna<6E>tre la liste de
ses enfants (de type <i>person</i>), ce qui correspond <20> une relation
<i>one-to-many</i> sur la m<>me table <i>person</i>.<br>
<br><br>
<a name="tuto_12"><u>
<font color="#100D5A">12- Remerciements</font>
</u></a><br>
<br>
Je remercie tout particuli<6C>rement <a href="http://www.developpez.net/forums/u254882/dourouc05/"
target="_blank">Thibaut Cuvelier</a> pour ses conseils pour l'am<61>lioration de ce tutoriel.<br>
Je remercie <20>galement <a href="http://www.developpez.net/forums/u124512/claudeleloup/"
target="_blank">Claude Leloup</a> pour ses relectures et corrections orthographiques.<br>
<br>
</td>
</tr>
</tbody>
</table>
<br>
<hr style="width: 80%" align="center" size="1" color="#100D5A">
<table border="0" style="width: 80%" align="center">
<col>
<col>
<col>
<tbody>
<tr>
<td align="left" valign="middle">
<img alt="QxOrm" src="./resource/logo_qxorm_small.png" width="168" height="40">
</td>
<td align="center" valign="middle">
<font size="2"><EFBFBD> 2011-202XDL Teamty - <a href="mailto:ic-east.com">ic-east.com</a></font>
</td>
<td align="right" valign="middle">
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="2K4Z58ZYAYJ6S">
<input type="image" src="./resource/paypal_support_qxorm_library.gif" border="0" name="submit"
alt="Support QxOrm library - PayPal">
<img alt="" border="0" src="https://www.paypalobjects.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
</form>
</td>
</tr>
</tbody>
</table>
</body>
</html>