Hello,
QxOrm is a new open source ORM (
Object Relational Mapping) C++ library designed to provide :
* 
Persistence (based on 
QtSql Qt module)
* 
Serialization (xml and binary, based on 
boost::serialization)
* 
Reflection (invoke class methods and access to properties)
QxOrm has been tested on 
Windows (
Visual C++ 2008 and 2010) and 
Linux (
GCC 4.4.1).
QxOrm is based on a simple and non intrusive '
setting function' (that can be compared with 
Hibernate xml mapping file).
A quick sample (and a tutorial) is available on this web site (only in french, an english translation is in progress...) : 
http://www.qxorm.com
PS: Sorry for my poor english
________
Quick sample using QxOrm :
* 1- 'drug.h' file : drug class definition with 3 properties : 'id', 'name' and 'description'
* 2- 'drug.cpp' file : setting function 'void qx::register_class()'
* 3- 'main.cpp' file : using QxOrm with drug class
* 4- Execute test program and print log output
* 5- 'export_drugs.xml' file created by test program
* -----------------------------------------------------------------------------------------------------
* 1- 'drug.h' file : drug class definition with 3 properties : 'id', 'name' and 'description'
* -----------------------------------------------------------------------------------------------------
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | #ifndef _CLASS_DRUG_H_
#define _CLASS_DRUG_H_
class drug
{
public:
   long id;
   QString name;
   QString description;
   drug() : id(0) { ; }
   virtual ~drug() { ; }
};
QX_REGISTER_HPP_MY_TEST_EXE(drug, qx::trait::no_base_class_defined, 1)
/* This macro is necessary to register 'drug' class in QxOrm context */
/* param 1 : the current class to register => 'drug' */
/* param 2 : the base class, if no base class, use the qx trait => 'qx::trait::no_base_class_defined' */
/* param 3 : the class version used by serialization to provide 'ascendant compatibility' */
#endif // _CLASS_DRUG_H_ 
 |  | 
* -----------------------------------------------------------------------------------------------------
* 2- 'drug.cpp' file : setting function 'void qx::register_class()'
* -----------------------------------------------------------------------------------------------------
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | #include "precompiled.h"   // Precompiled-header with '#include <QxOrm.h>' and '#include "export.h"'
#include "drug.h"          // Class definition 'drug'
#include <QxMemLeak.h>     // Automatic memory leak detection
QX_REGISTER_CPP_MY_TEST_EXE(drug)   // This macro is necessary to register 'drug' class in QxOrm context
namespace qx {
template <> void register_class(QxClass<drug> & t)
{
  t.id(& drug::id, "id");               // Register 'drug::id' <=> primary key in your database
  t.data(& drug::name, "name", 1);      // Register 'drug::name' property with key 'name' and version '1'
  t.data(& drug::description, "desc");  // Register 'drug::description' property with key 'desc'
}}
 |  | 
* -----------------------------------------------------------------------------------------------------
* 3- 'main.cpp' file : using QxOrm with drug class
* -----------------------------------------------------------------------------------------------------
| 12
 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
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 
 | #include "precompiled.h"
#include "drug.h"
#include <QxMemLeak.h>
int main(int argc, char * argv[])
{
   QApplication app(argc, argv); // Qt application
   // Create 3 new drugs
   // It is possible to use 'boost' and 'Qt' smart pointer : 'boost::shared_ptr', 'QSharedPointer', etc...
   typedef boost::shared_ptr<drug> drug_ptr;
   drug_ptr d1; d1.reset(new drug()); d1->name = "name1"; d1->description = "desc1";
   drug_ptr d2; d2.reset(new drug()); d2->name = "name2"; d2->description = "desc2";
   drug_ptr d3; d3.reset(new drug()); d3->name = "name3"; d3->description = "desc3";
   // Insert drugs into container
   // It is possible to use a lot of containers from 'std', 'boost', 'Qt' and 'qx::QxCollection<Key, Value>'
   typedef std::vector<drug_ptr> type_lst_drug;
   type_lst_drug lst_drug;
   lst_drug.push_back(d1);
   lst_drug.push_back(d2);
   lst_drug.push_back(d3);
   // Init parameters to communicate with a database
   qx::QxSqlDatabase::getSingleton()->setDriverName("QSQLITE");
   qx::QxSqlDatabase::getSingleton()->setDatabaseName("./test_qxorm.db");
   qx::QxSqlDatabase::getSingleton()->setHostName("localhost");
   qx::QxSqlDatabase::getSingleton()->setUserName("root");
   qx::QxSqlDatabase::getSingleton()->setPassword("");
   // Create table 'drug' into database to store drugs
   QSqlError daoError = qx::dao::create_table<drug>();
   // Insert drugs from container to database
   // 'id' property of 'd1', 'd2' and 'd3' are auto-updated
   daoError = qx::dao::insert(lst_drug);
   // Modify and update the second drug into database
   d2->name = "name2 modified";
   d2->description = "desc2 modified";
   daoError = qx::dao::update(d2);
   // Delete the first drug from database
   daoError = qx::dao::delete_by_id(d1);
   // Count drugs into database
   long lDrugCount = qx::dao::count<drug>();
   // Fetch drug with id '3' into a new variable
   drug_ptr d_tmp; d_tmp.reset(new drug());
   d_tmp->id = 3;
   daoError = qx::dao::fetch_by_id(d_tmp);
   // Export drugs from container to a file under xml format (serialization)
   qx::serialization::xml::to_file(lst_drug, "./export_drugs.xml");
   // Import drugs from xml file into a new container
   type_lst_drug lst_drug_tmp;
   qx::serialization::xml::from_file(lst_drug_tmp, "./export_drugs.xml");
   // Clone a drug
   drug_ptr d_clone = qx::clone(* d1);
   // Create a new drug by class name (factory)
   boost::any d_any = qx::create("drug");
   // Insert drugs container into 'qx::cache'
   qx::cache::set("drugs", lst_drug);
   // Remove all elements from 'qx::cache'
   qx::cache::clear();
   // Create a dummy memory leak
   drug * pDummy = new drug();
   return 0;
}
 |  | 
* -----------------------------------------------------------------------------------------------------
* 4- Execute test program and print log output
* -----------------------------------------------------------------------------------------------------
| [QxOrm] qx::QxSqlDatabase : create new database connection in thread '3616' with key '{d315250c-b5c9-46e0-9402-f800368a6673}'
[QxOrm] sql query (78 ms) : CREATE TABLE drug (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT, desc TEXT)
[QxOrm] sql query (63 ms) : INSERT INTO drug (name, desc) VALUES (:name, :desc)
[QxOrm] sql query (62 ms) : UPDATE drug SET id = :id, name = :name, desc = :desc WHERE id = :id_bis
[QxOrm] sql query (63 ms) : DELETE FROM drug WHERE id = :id
[QxOrm] sql query (0 ms) : SELECT COUNT(*) FROM drug
[QxOrm] sql query (0 ms) : SELECT drug.id AS drug_id_0, drug.name AS drug_name_0, drug.desc AS drug_desc_0 FROM drug WHERE drug_id_0 = :id
[QxOrm] Leaked object at 0xf52ad8 (size 16, src\main.cpp:74)
[QxOrm] **** 1 memory leaks found **** | 
* -----------------------------------------------------------------------------------------------------
* 5- 'export_drugs.xml' file created by test program
* -----------------------------------------------------------------------------------------------------
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
 | <std.vector-boost.shared_ptr-drug-- class_id="0" tracking_level="0" version="0">
	<count>3</count>
	<item_version>1</item_version>
	<item class_id="1" tracking_level="0" version="1">
		<px class_id="2" tracking_level="1" version="1" object_id="_0">
			<id>1</id>
			<name class_id="3" tracking_level="0" version="0">name1</name>
			<desc>desc1</desc>
		</px>
	</item>
	<item>
		<px class_id_reference="2" object_id="_1">
			<id>2</id>
			<name>name2 modified</name>
			<desc>desc2 modified</desc>
		</px>
	</item>
	<item>
		<px class_id_reference="2" object_id="_2">
			<id>3</id>
			<name>name3</name>
			<desc>desc3</desc>
		</px>
	</item>
</std.vector-boost.shared_ptr-drug-->
 |  |