commit 6d91d3817e9a022261ec6fb5935c055967ca91ac
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Wed Jun 24 00:51:14 2015 +0200

    some bug fixes, caching works

diff --git a/example/main.cpp b/example/main.cpp
index 0632d7d..412ea5f 100644
--- a/example/main.cpp
+++ b/example/main.cpp
@@ -20,17 +20,16 @@
  */
 using namespace CuteEntityManager;
 int main(int argc, char *argv[]) {
-//    Q_UNUSED(argc) Q_UNUSED(argv)
+    Q_UNUSED(argc) Q_UNUSED(argv)
     CuteEntityManager::EntityManager *e = new
     CuteEntityManager::EntityManager("QSQLITE",
                                      QDir::currentPath() + "/db.sqlite");
     QSharedPointer<Artikel> a = QSharedPointer<Artikel>(new Artikel(20.0,
                                 "Müsli"));
     auto ep = a.dynamicCast<CuteEntityManager::Entity>();
-    qDebug() << e;
     qDebug() << "Tabelle artikel erstellt:" << e->createTable(ep);
     e->create(ep);
-    //qDebug() << e->findById<Artikel *>(1); //not working grml!
+    auto artikel = e->findById<Artikel *>(1);
 //    QSharedPointer<CuteEntityManager::Entity> p = QSharedPointer<CuteEntityManager::Entity>(new Person("Max", "Mustermann", Person::MALE, "", "", "",
 //                               QDate::currentDate()));
 //    auto pptr = p.dynamicCast<CuteEntityManager::Entity>();
@@ -46,15 +45,13 @@ int main(int argc, char *argv[]) {
 //        e->save(a);
 //    }
 //    qDebug() << "Dauer:" << t.elapsed();
+    //QSharedPointer<Artikel> aPtr = QSharedPointer<Artikel>(entity);
     Pupil *p = new Pupil();
-    auto hash = p->getMetaProperties();
 //    auto iterator = hash.constBegin();
 //    while(iterator != hash.constEnd()) {
 //        qDebug() << iterator.key() << " Value:" << iterator.value().read(p);
-
 //        iterator++;
 //    }
-    qDebug() << p->metaObject()->superClass()->className();
 
     return 0;
 }
diff --git a/example/models/artikel.cpp b/example/models/artikel.cpp
index a84a95a..493e669 100644
--- a/example/models/artikel.cpp
+++ b/example/models/artikel.cpp
@@ -39,14 +39,12 @@ Artikel::~Artikel() {
 
 }
 
-Artikel::Artikel(QObject *parent) : Entity(parent)
-{
-
+Artikel::Artikel() : Entity() {
+    this->preis = 0.0;
+    this->name = "";
 }
 
-Artikel::Artikel(double preis, QString name) : Entity(){
+Artikel::Artikel(double preis, QString name) : Entity() {
     this->preis = preis;
     this->name = name;
 }
-
-
diff --git a/example/models/artikel.h b/example/models/artikel.h
index 4a13e4f..1467031 100644
--- a/example/models/artikel.h
+++ b/example/models/artikel.h
@@ -24,7 +24,7 @@
 #include <QHash>
 #include <QVariant>
 
-class Artikel : virtual public CuteEntityManager::Entity {
+class Artikel : public CuteEntityManager::Entity {
     Q_OBJECT
     Q_PROPERTY(double preis READ getPreis WRITE setPreis)
     Q_PROPERTY(QString name READ getName WRITE setName)
@@ -33,8 +33,8 @@ class Artikel : virtual public CuteEntityManager::Entity {
     QString name;
 
   public:
-    ~Artikel();
-    explicit Artikel(QObject *parent = 0);
+    virtual ~Artikel();
+    Q_INVOKABLE Artikel();
     Artikel(double preis, QString name);
     double getPreis() const;
     void setPreis(double value);
diff --git a/src/entity.h b/src/entity.h
index 319f1b7..b39ef60 100644
--- a/src/entity.h
+++ b/src/entity.h
@@ -41,7 +41,7 @@ class Entity : public QObject {
     void idChanged();
 
   public:
-    Entity (QObject *parent = 0);
+    explicit Entity (QObject *parent = 0);
     virtual QString toString() const;
     virtual ~Entity();
     virtual QString getTablename() const;
@@ -57,10 +57,12 @@ class Entity : public QObject {
 
     //return value must be the exact name defined in Q_PROPERTY
     virtual QString getPrimaryKey() const;
-    const QStack<const QMetaObject *> superClasses(bool stopAtSingleTableInheritance = false) const;
+    const QStack<const QMetaObject *> superClasses(bool stopAtSingleTableInheritance
+            = false) const;
     const QHash<QString, QMetaProperty> getMetaProperties() const;
     const QHash<QString, QMetaProperty> getSuperMetaProperties() const;
-    static const QHash<QString, QMetaProperty> getMetaProperties(const QMetaObject* object);
+    static const QHash<QString, QMetaProperty> getMetaProperties(
+        const QMetaObject *object);
     const QHash<QString, QMetaProperty> getInheritedMetaProperties() const;
     const QHash<Relation, QMetaProperty> getRelationProperties() const;
     const char *getClassname() const;
diff --git a/src/entityinstancefactory.cpp b/src/entityinstancefactory.cpp
index 212f24e..c44a9c7 100644
--- a/src/entityinstancefactory.cpp
+++ b/src/entityinstancefactory.cpp
@@ -22,7 +22,12 @@ EntityInstanceFactory::EntityInstanceFactory() {
 }
 
 Entity *EntityInstanceFactory::createInstance(const char *className) {
-    return EntityInstanceFactory::createInstance(QMetaType::type(className));
+    QString s = QString(className);
+    if (!s.contains("*")) {
+        s.append("*");
+    }
+    return EntityInstanceFactory::createInstance(QMetaType::type(
+                s.toUtf8().constData()));
 }
 
 Entity *EntityInstanceFactory::createInstance(const QString &className) {
@@ -32,26 +37,27 @@ Entity *EntityInstanceFactory::createInstance(const QString &className) {
 Entity *EntityInstanceFactory::createInstance(int metaTypeId) {
     Entity *e = 0;
     if (metaTypeId != QMetaType::UnknownType) {
-        e = static_cast<Entity *>(QMetaType::create(metaTypeId));
-        if(!e) {
+        auto metaObject = QMetaType::metaObjectForType(metaTypeId);
+        e = static_cast<Entity *>(metaObject->newInstance());
+        if (!e) {
             qDebug() << "Entity instance could not created!";
-            throw -2; //testing
-        }
-        } else {
-            qDebug() << metaTypeId <<" is NOT registered! Please register it!";
-            throw -1; //testing
+            throw - 2; //testing
         }
+    } else {
+        qDebug() << metaTypeId << "EntityClass NOT registered! Please register it!";
+        throw - 1; //testing
+    }
     return e;
 }
 
 Entity *EntityInstanceFactory::createInstance(const char *className,
         const QHash<QString, QVariant> &attributes) {
     Entity *e = EntityInstanceFactory::createInstance(className);
-    EntityInstanceFactory::setAttributes(e, attributes);
+    e = EntityInstanceFactory::setAttributes(e, attributes);
     return e;
 }
 
-Entity *EntityInstanceFactory::setAttributes(Entity *e,
+Entity *EntityInstanceFactory::setAttributes(Entity *&e,
         const QHash<QString, QVariant> &attributes,
         QHash<QString, QMetaProperty> metaprops) {
     if (e) {
@@ -59,7 +65,7 @@ Entity *EntityInstanceFactory::setAttributes(Entity *e,
         while (iterator != attributes.constEnd()) {
             if (metaprops.contains(iterator.key())) {
                 QMetaProperty prop = metaprops.value(iterator.key());
-                if (!prop.isWritable() && !prop.write(e, iterator.value())) {
+                if (!(prop.isWritable() && prop.write(e, iterator.value()))) {
                     qDebug() << prop.name() << "on Entity" << e->getClassname() << "not writeable!";
                 }
             }
@@ -69,7 +75,7 @@ Entity *EntityInstanceFactory::setAttributes(Entity *e,
     return e;
 }
 
-Entity *EntityInstanceFactory::setAttributes(Entity *e,
+Entity *EntityInstanceFactory::setAttributes(Entity *&e,
         const QHash<QString, QVariant> &attributes) {
     auto metaprops = e->getMetaProperties();
     return EntityInstanceFactory::setAttributes(e, attributes, metaprops);
diff --git a/src/entityinstancefactory.h b/src/entityinstancefactory.h
index d329cb2..2008ac6 100644
--- a/src/entityinstancefactory.h
+++ b/src/entityinstancefactory.h
@@ -28,10 +28,10 @@ class EntityInstanceFactory {
     static Entity *createInstance(int metaTypeId);
     static Entity *createInstance(const char *className,
                                   const QHash<QString, QVariant> &attributes);
-    static Entity *setAttributes(Entity *e,
+    static Entity *setAttributes(Entity *&e,
                                  const QHash<QString, QVariant> &attributes,
                                  QHash<QString, QMetaProperty> metaprops);
-    static Entity *setAttributes(Entity *e,
+    static Entity *setAttributes(Entity *&e,
                                  const QHash<QString, QVariant> &attributes);
     static const QString extractEntityType(const QString &s);
     static Entity *newSuperClassInstance(const Entity *e);
diff --git a/src/entitymanager.cpp b/src/entitymanager.cpp
index ebd4efd..b1bb932 100644
--- a/src/entitymanager.cpp
+++ b/src/entitymanager.cpp
@@ -135,9 +135,9 @@ QSharedPointer<Entity> EntityManager::findById(const qint64 &id,
         const bool refresh) {
     QSharedPointer<Entity> r;
     if (!e.isNull()) {
-        if (refresh || ((r = this->cache.get(id, QString(e.data()->getClassname())))
-                        && !r.data())) {
-            auto map  = this->findByPk(e);
+        if (refresh || !(r = this->cache.get(id, QString(e.data()->getClassname())))) {
+            e.data()->setId(id);
+            auto map  = this->findByPk(id, e);
             r = this->convert(map, e->getClassname(), refresh);
         }
     }
@@ -551,7 +551,7 @@ bool EntityManager::create(QSharedPointer<Entity> &entity,
         QSqlQuery q = this->schema.data()->getQueryBuilder().data()->create(entity);
         rc = this->db->transaction(q);
         if (rc) {
-            entity.data()->setId(this->schema.data()->getLastInsertID().toLongLong(&rc));
+            entity.data()->setId(q.lastInsertId().toLongLong(&rc));
             if (persistRelations) {
                 this->saveRelations(entity);
             }
@@ -569,9 +569,10 @@ QStringList EntityManager::getConnectionNames() {
     return EntityManager::connectionNames;
 }
 
-QHash<QString, QVariant> EntityManager::findByPk(const QSharedPointer<Entity>
+QHash<QString, QVariant> EntityManager::findByPk(qint64 id,
+        const QSharedPointer<Entity>
         &e) {
-    QSqlQuery q = this->schema.data()->getQueryBuilder().data()->find(e);
+    QSqlQuery q = this->schema.data()->getQueryBuilder().data()->find(id, e);
     auto listMap  = this->convertQueryResult(q);
     if (!listMap.isEmpty()) {
         return listMap.at(0);
diff --git a/src/entitymanager.h b/src/entitymanager.h
index cb42808..e4bb01b 100644
--- a/src/entitymanager.h
+++ b/src/entitymanager.h
@@ -53,7 +53,7 @@ class EntityManager {
     QList<QHash<QString, QVariant> > findAll(const QSharedPointer<Entity> &e);
     void resolveRelations(const QSharedPointer<Entity> &entity,
                           const QHash<QString, QVariant> &map, const bool refresh = false);
-    QHash<QString, QVariant> findByPk(const QSharedPointer<Entity> &e);
+    QHash<QString, QVariant> findByPk(qint64 id, const QSharedPointer<Entity> &e);
     QSharedPointer<Entity> convert(const QHash<QString, QVariant> &map,
                                    const char *classname, const bool refresh = false);
     QList<QSharedPointer<Entity>> convert(QList<QHash<QString, QVariant> > maps,
@@ -159,8 +159,9 @@ class EntityManager {
     }
 
     template<class T> QList<QSharedPointer<Entity>> findAll() {
-        QSharedPointer<Entity> ptr = QSharedPointer<Entity>(EntityInstanceFactory::createInstance<T>());
-        if (!ptr.isNull()) {
+        QSharedPointer<Entity> ptr = QSharedPointer<Entity>
+                                     (EntityInstanceFactory::createInstance<T>());
+        if (ptr) {
             auto maps = this->findAll(ptr);
             const char *className = ptr.data()->getClassname();
             return this->convert(maps, className);
diff --git a/src/querybuilder.cpp b/src/querybuilder.cpp
index 89fd9e2..1cec2de 100644
--- a/src/querybuilder.cpp
+++ b/src/querybuilder.cpp
@@ -145,8 +145,8 @@ QString QueryBuilder::createFkSuperClass(const Entity *e) const {
     QString r = "";
     auto superMetaObject = e->metaObject()->superClass();
     if (e->getInheritanceStrategy() == JOINED_TABLE
-            && QString(superMetaObject->className()) != QString("CuteEntityManager::Entity")) {
-        qDebug() << superMetaObject->className();
+            && QString(superMetaObject->className()) !=
+            QString("CuteEntityManager::Entity")) {
         Entity *superClass  = EntityInstanceFactory::createInstance(
                                   superMetaObject->className());
         if (superClass) {
@@ -384,8 +384,9 @@ const {
             }
         }
     }
-    if (QString(superMetaObject->className()) != QString("CuteEntityManager::Entity")
-            && entity.data()->getInheritanceStrategy() != JOINED_TABLE) {
+    if (!(QString(superMetaObject->className()) !=
+            QString("CuteEntityManager::Entity")
+            && entity.data()->getInheritanceStrategy() == JOINED_TABLE)) {
         map.insert(entity.data()->getPrimaryKey(), this->schema.data()->TYPE_BIGPK);
     }
     return map;
@@ -519,12 +520,12 @@ QString QueryBuilder::selectBase(const QStringList &tables,
     return r;
 }
 
-QSqlQuery QueryBuilder::find(const QSharedPointer<Entity> &entity,
-                             qint64 offset) const {
+QSqlQuery QueryBuilder::find(const qint64 &id, const QSharedPointer<Entity> &entity, qint64 offset) const
+{
     QSqlQuery q = this->database.data()->getQuery(this->selectBase(QStringList(
-                      entity.data()->getTablename())) + " " + this->joinSuperClasses(
-                      entity) + " WHERE id= :id " + this->limit(1, offset));
-    q.bindValue(":id", entity.data()->getId());
+                      entity.data()->getTablename())) + this->joinSuperClasses(
+                      entity) + " WHERE id= :id" + this->limit(1, offset));
+    q.bindValue(":id", id);
     return q;
 }
 
@@ -532,7 +533,7 @@ QSqlQuery QueryBuilder::findAll(const QSharedPointer<Entity> &entity,
                                 const qint64 limit, qint64 offset) {
     return this->database->getQuery(this->selectBase(QStringList(
                                         entity.data()->getTablename())) + " " + this->joinSuperClasses(
-                                        entity) + " " + this->limit(limit, offset) + ";");
+                                        entity) + this->limit(limit, offset) + ";");
 }
 
 /**
@@ -683,19 +684,12 @@ QString QueryBuilder::joinSuperClasses(const QSharedPointer<Entity> &entity)
 const {
     auto stack = entity.data()->superClasses();
     QString joined = "";
-    bool first = true;
     Entity *e = 0;
     while (!stack.isEmpty()) {
         auto metaObject = stack.pop();
         e = EntityInstanceFactory::createInstance(metaObject->className());
-        if (first) {
-            first = false;
-        } else {
-            if (e) {
-                joined.append(" ");
-            }
-        }
         if (e) {
+            joined.append(" ");
             joined.append(this->leftJoin(e->getTablename(), entity.data()->getTablename(),
                                          e->getPrimaryKey(), entity.data()->getPrimaryKey()));
         }
diff --git a/src/querybuilder.h b/src/querybuilder.h
index 598edc3..3dc859a 100644
--- a/src/querybuilder.h
+++ b/src/querybuilder.h
@@ -101,7 +101,7 @@ class QueryBuilder {
     QString transformAbstractTypeToRealDbType(QString typeName) const;
     QString getColumnType(const QString &type) const;
     QSqlQuery find(const qint64 &id, const QString &tableName) const;
-    QSqlQuery find(const QSharedPointer<Entity> &entity,
+    QSqlQuery find(const qint64 &id, const QSharedPointer<Entity> &entity,
                    qint64 offset = 0) const;
     QSqlQuery findByAttributes(const QHash<QString, QVariant> &m,
                                const QString &tableName,
diff --git a/src/schema.cpp b/src/schema.cpp
index c6be0cb..23255cb 100644
--- a/src/schema.cpp
+++ b/src/schema.cpp
@@ -120,7 +120,8 @@ QStringList Schema::getTableNames(QString schema) {
 
 QVariant Schema::getLastInsertID() {
     QSqlQuery q(this->database.data()->getDatabase());
-    return q.lastInsertId();
+    auto lastId = q.lastInsertId();
+    return lastId;
 }
 
 void Schema::refresh() {
