commit e8d1537ce72e8ebfd612e1631b54ad9f4b704cd3
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Sun Jul 26 21:16:08 2015 +0200

    entityhelper class

diff --git a/EntityManager.pro b/EntityManager.pro
index a766a4d..ae333f3 100644
--- a/EntityManager.pro
+++ b/EntityManager.pro
@@ -23,7 +23,8 @@ src/entity.h \
     src/relation.h \
     src/entityinstancefactory.h \
     src/condition.h \
-    src/cache.h
+    src/cache.h \
+    src/entityhelper.h
 
 SOURCES += \
 src/entity.cpp \
@@ -40,7 +41,8 @@ src/entity.cpp \
     src/relation.cpp \
     src/entityinstancefactory.cpp \
     src/condition.cpp \
-    src/cache.cpp
+    src/cache.cpp \
+    src/entityhelper.cpp
 
 unix {
     target.path = /usr/lib
diff --git a/src/cache.cpp b/src/cache.cpp
index 13448a8..0f5d469 100644
--- a/src/cache.cpp
+++ b/src/cache.cpp
@@ -14,6 +14,7 @@
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 #include "cache.h"
+#include "entityhelper.h"
 using namespace CuteEntityManager;
 Cache::Cache() {
 
@@ -37,7 +38,7 @@ bool Cache::contains(const QString &key) {
 void Cache::insert(QSharedPointer<Entity> &entity) {
     if (entity && entity->getId() > -1) {
         QString key = this->generateKey(entity->getId(),
-                                        QString(entity->getClassname()));
+                                        EntityHelper::getClassName(entity.data()));
         if (this->cache.contains(key)) {
             QSharedPointer<Entity> ptr = this->cache.value(key).toStrongRef();
             if (ptr) {
@@ -51,7 +52,7 @@ void Cache::insert(QSharedPointer<Entity> &entity) {
 
 void Cache::remove(const QSharedPointer<Entity> &entity) {
     if (entity.data() && entity->getId() > -1) {
-        this->remove(entity->getId(), QString(entity->getClassname()));
+        this->remove(entity->getId(), EntityHelper::getClassName(entity.data()));
     }
 }
 
diff --git a/src/cache.h b/src/cache.h
index 040d542..8696fde 100644
--- a/src/cache.h
+++ b/src/cache.h
@@ -20,6 +20,7 @@
 #include <QSharedPointer>
 #include "entityinstancefactory.h"
 #include "entity.h"
+#include "entityhelper.h"
 
 namespace CuteEntityManager {
 class Entity;
@@ -33,7 +34,7 @@ class Cache {
         bool ok = false;
         Entity *e = EntityInstanceFactory::createInstance<T>();
         if (e) {
-            ok = this->contains(id, QString(e->getClassname()));
+            ok = this->contains(id, QString(EntityHelper::getClassname(e)));
             delete e;
         }
         return ok;
@@ -44,7 +45,7 @@ class Cache {
     template<class T> void remove(qint64 id) {
         Entity *e = EntityInstanceFactory::createInstance<T>();
         if (e) {
-            this->remove(id, QString(e->getClassname()));
+            this->remove(id, QString(EntityHelper::getClassname(e)));
             delete e;
         }
     }
@@ -53,7 +54,7 @@ class Cache {
     template<class T> QSharedPointer<Entity> get(qint64 id) {
         Entity *e = EntityInstanceFactory::createInstance<T>();
         if (e) {
-            return this->get(id, QString(e->getClassname()));
+            return this->get(id, QString(EntityHelper::getClassname(e)));
             delete e;
         }
         return QSharedPointer<Entity>();
diff --git a/src/entity.cpp b/src/entity.cpp
index 0c244b3..6093257 100644
--- a/src/entity.cpp
+++ b/src/entity.cpp
@@ -15,7 +15,7 @@
  */
 
 #include "entity.h"
-
+#include "entityhelper.h"
 using namespace CuteEntityManager;
 
 Entity::Entity(QObject *parent) : QObject(parent) {
@@ -24,9 +24,9 @@ Entity::Entity(QObject *parent) : QObject(parent) {
 
 QString Entity::toString() const {
     QString r = "";
-    r.append(this->getClassname());
+    r.append(EntityHelper::getClassName(this));
     r.append(": {");
-    auto properties = this->getMetaProperties();
+    auto properties = EntityHelper::getMetaProperties(this);
     for (auto var = properties.constBegin(); var != properties.constEnd(); ++var) {
         QString val = "";
         auto value = var.value().read(this);
@@ -50,7 +50,7 @@ QString Entity::toString() const {
 
 QString Entity::slimToString() const {
     QString r = "";
-    r.append(this->getClassname());
+    r.append(EntityHelper::getClassName(this));
     r.append(": {");
     r.append("id: ") + this->getId() + "}";
     return r;
@@ -68,24 +68,6 @@ const QHash<QString, Relation> Entity::getRelations() const {
     return QHash<QString, Relation>();
 }
 
-const QHash<QString, Relation> Entity::getNonInheritedRelations() const {
-    auto relations = this->getRelations();
-    auto superObject = EntityInstanceFactory::newSuperClassInstance(this);
-    if (superObject) {
-        auto superRelations = superObject->getRelations();
-        auto iterator = superRelations.constBegin();
-        while (iterator != relations.constEnd()) {
-            if (relations.contains(iterator.key())) {
-                relations.remove(iterator.key());
-            }
-            ++iterator;
-        }
-        delete superObject;
-        superObject = nullptr;
-    }
-    return relations;
-}
-
 const QStringList Entity::getTransientAttributes() const {
     return QStringList();
 }
@@ -106,94 +88,6 @@ QString Entity::getPrimaryKey() const {
     return "id";
 }
 
-const QList<const QMetaObject *> Entity::superClasses(bool
-        stopAtSingleTableInheritance) const {
-    QList<const QMetaObject *> classes = QList<const QMetaObject *>();
-    auto superMetaObject = this->metaObject()->superClass();
-    if (this->getInheritanceStrategy() == InheritanceStrategy::JOINED_TABLE) {
-        Entity *e = nullptr;
-        while (superMetaObject && QString(superMetaObject->className()) !=
-                QString("CuteEntityManager::Entity")) {
-            e = EntityInstanceFactory::createInstance(superMetaObject->className());
-            if (e) {
-                classes.append(superMetaObject);
-                superMetaObject = superMetaObject->superClass();
-                InheritanceStrategy s = e->getInheritanceStrategy();
-                delete e;
-                e = nullptr;
-                if (stopAtSingleTableInheritance && s == InheritanceStrategy::PER_CLASS_TABLE) {
-                    break;
-                }
-            } else {
-                break;
-            }
-        }
-    }
-    return classes;
-}
-
-const QHash<QString, QMetaProperty> Entity::getMetaProperties() const {
-    return Entity::getMetaProperties(this->metaObject());
-}
-
-const QHash<QString, QMetaProperty> Entity::getSuperMetaProperties() const {
-    auto superMetaObjectPropertyMap = QHash<QString, QMetaProperty>();
-    auto superMeta = this->metaObject()->superClass();
-    if (QString(superMeta->className()) != QString("CuteEntityManager::Entity")
-            && this->getInheritanceStrategy() == InheritanceStrategy::JOINED_TABLE) {
-        for (int var = 0; var < superMeta->propertyCount(); ++var) {
-            QMetaProperty prop = superMeta->property(var);
-            if (prop.isReadable() && prop.isWritable()) {
-                superMetaObjectPropertyMap.insert(QString(prop.name()), prop);
-            }
-        }
-    }
-    return superMetaObjectPropertyMap;
-}
-
-const QHash<QString, QMetaProperty> Entity::getMetaProperties(
-    const QMetaObject *object) {
-    auto h = QHash<QString, QMetaProperty>();
-    for (int var = 0; var < object->propertyCount(); ++var) {
-        QMetaProperty m = object->property(var);
-        if (m.isValid() && m.name() != QString("objectName")) {
-            h.insert(m.name(), m);
-        }
-    }
-    return h;
-}
-
-const QHash<QString, QMetaProperty> Entity::getInheritedMetaProperties() const {
-    auto classes = this->superClasses();
-    auto wholeProperties = QHash<QString, QMetaProperty>();
-    for (int var = classes.size() - 1; var >= 0; --var) {
-        auto metaObject = classes.at(var);
-        auto properties = Entity::getMetaProperties(metaObject);
-        auto iterator = properties.constBegin();
-        while (iterator != properties.constEnd()) {
-            wholeProperties.insert(iterator.key(), iterator.value());
-            ++iterator;
-        }
-    }
-    return wholeProperties;
-}
-
-const QHash<Relation, QMetaProperty> Entity::getRelationProperties() const {
-    auto h = QHash<Relation, QMetaProperty>();
-    auto relations = this->getRelations();
-    for (int var = 0; var < this->metaObject()->propertyCount(); ++var) {
-        QMetaProperty m = this->metaObject()->property(var);
-        if (m.isValid() && relations.contains(QString(m.name()))) {
-            h.insert(relations.value(m.name()), m);
-        }
-    }
-    return h;
-}
-
-const char *Entity::getClassname() const {
-    return this->metaObject()->className();
-}
-
 QVariant Entity::getProperty(const QString &name) const {
     if (!name.isEmpty()) {
         return QObject::property(name.toLatin1().constData());
diff --git a/src/entity.h b/src/entity.h
index 4f1d079..059bd24 100644
--- a/src/entity.h
+++ b/src/entity.h
@@ -51,20 +51,9 @@ class Entity : public QObject {
     virtual bool isInheritanceCascaded() const;
     //return value must be the exact name defined in Q_PROPERTY
     virtual QString getPrimaryKey() const;
-    const QHash<QString, Relation> getNonInheritedRelations() const;
-    const QList<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);
-    const QHash<QString, QMetaProperty> getInheritedMetaProperties() const;
-    const QHash<Relation, QMetaProperty> getRelationProperties() const;
-    const char *getClassname() const;
 
     QVariant getProperty(const QString &name) const;
     bool setProperty(const QString &name, const QVariant &value);
-
     qint64 getId() const;
     void setId(const qint64 &value);
 
diff --git a/src/entityhelper.cpp b/src/entityhelper.cpp
new file mode 100644
index 0000000..ffe1331
--- /dev/null
+++ b/src/entityhelper.cpp
@@ -0,0 +1,183 @@
+#include "entityhelper.h"
+#include "entity.h"
+#include "relation.h"
+#include "cache.h"
+
+using namespace CuteEntityManager;
+EntityHelper::EntityHelper()
+{
+
+}
+
+
+const QHash<QString, Relation> EntityHelper::getNonInheritedRelations(const Entity *entity) {
+    auto relations = entity->getRelations();
+    auto superObject = EntityInstanceFactory::newSuperClassInstance(entity);
+    if (superObject) {
+        auto superRelations = superObject->getRelations();
+        auto iterator = superRelations.constBegin();
+        while (iterator != relations.constEnd()) {
+            if (relations.contains(iterator.key())) {
+                relations.remove(iterator.key());
+            }
+            ++iterator;
+        }
+        delete superObject;
+        superObject = nullptr;
+    }
+    return relations;
+}
+
+
+const QList<const QMetaObject *> EntityHelper::superClasses(const Entity *entity,bool
+                                                            stopAtSingleTableInheritance) {
+    QList<const QMetaObject *> classes = QList<const QMetaObject *>();
+    auto superMetaObject = entity->metaObject()->superClass();
+    if (entity->getInheritanceStrategy() == InheritanceStrategy::JOINED_TABLE) {
+        Entity *e = nullptr;
+        while (superMetaObject && QString(superMetaObject->className()) !=
+               QString("CuteEntityManager::Entity")) {
+            e = EntityInstanceFactory::createInstance(superMetaObject->className());
+            if (e) {
+                classes.append(superMetaObject);
+                superMetaObject = superMetaObject->superClass();
+                InheritanceStrategy s = e->getInheritanceStrategy();
+                delete e;
+                e = nullptr;
+                if (stopAtSingleTableInheritance && s == InheritanceStrategy::PER_CLASS_TABLE) {
+                    break;
+                }
+            } else {
+                break;
+            }
+        }
+    }
+    return classes;
+}
+
+const QHash<QString, QMetaProperty> EntityHelper::getMetaProperties(const Entity *entity) {
+    return EntityHelper::getMetaProperties(entity->metaObject());
+}
+
+const QHash<QString, QMetaProperty> EntityHelper::getSuperMetaProperties(const Entity *entity) {
+    auto superMetaObjectPropertyMap = QHash<QString, QMetaProperty>();
+    auto superMeta = entity->metaObject()->superClass();
+    if (QString(superMeta->className()) != QString("CuteEntityManager::Entity")
+            && entity->getInheritanceStrategy() == InheritanceStrategy::JOINED_TABLE) {
+        for (int var = 0; var < superMeta->propertyCount(); ++var) {
+            QMetaProperty prop = superMeta->property(var);
+            if (prop.isReadable() && prop.isWritable()) {
+                superMetaObjectPropertyMap.insert(QString(prop.name()), prop);
+            }
+        }
+    }
+    return superMetaObjectPropertyMap;
+}
+
+const QHash<QString, QMetaProperty> EntityHelper::getMetaProperties(
+        const QMetaObject *object) {
+    auto h = QHash<QString, QMetaProperty>();
+    for (int var = 0; var < object->propertyCount(); ++var) {
+        QMetaProperty m = object->property(var);
+        if (m.isValid() && m.name() != QString("objectName")) {
+            h.insert(m.name(), m);
+        }
+    }
+    return h;
+}
+
+const QHash<QString, QMetaProperty> EntityHelper::getInheritedMetaProperties(const Entity *entity) {
+    auto classes = EntityHelper::superClasses(entity);
+    auto wholeProperties = QHash<QString, QMetaProperty>();
+    for (int var = classes.size() - 1; var >= 0; --var) {
+        auto metaObject = classes.at(var);
+        auto properties = EntityHelper::getMetaProperties(metaObject);
+        auto iterator = properties.constBegin();
+        while (iterator != properties.constEnd()) {
+            wholeProperties.insert(iterator.key(), iterator.value());
+            ++iterator;
+        }
+    }
+    return wholeProperties;
+}
+
+const QHash<Relation, QMetaProperty> EntityHelper::getRelationProperties(const Entity *entity) {
+    auto h = QHash<Relation, QMetaProperty>();
+    auto relations = entity->getRelations();
+    for (int var = 0; var < entity->metaObject()->propertyCount(); ++var) {
+        QMetaProperty m = entity->metaObject()->property(var);
+        if (m.isValid() && relations.contains(QString(m.name()))) {
+            h.insert(relations.value(m.name()), m);
+        }
+    }
+    return h;
+}
+
+const char *EntityHelper::getClassname(const Entity *entity) {
+    return entity->metaObject()->className();
+}
+
+const QString EntityHelper::getClassName(const Entity *entity)
+{
+    return QString(entity->metaObject()->className());
+}
+
+void EntityHelper::setListProperty(const QSharedPointer<Entity> &entity,
+                                    QList<QSharedPointer<Entity> > &list,
+                                    const QMetaProperty &property)  {
+    QVariant var;
+    var.setValue<QList<QSharedPointer<Entity>>>(list);
+    property.write(entity.data(),var);
+}
+
+void EntityHelper::addEntityToListProperty(const QSharedPointer<Entity>
+        &entity, QSharedPointer<Entity> add, const QMetaProperty &property) {
+    QVariant var = property.read(entity.data());
+    if (!var.isNull() && var.canConvert<QList<QVariant>>()) {
+        auto list = EntityInstanceFactory::castQVariantList(var);
+        if (!list.contains(add)) {
+            list.append(add);
+            EntityHelper::setListProperty(entity, list, property);
+        }
+    }
+}
+
+void EntityHelper::setProperty(const QSharedPointer<Entity> &entity,
+                                QSharedPointer<Entity> value,
+                                const QMetaProperty &property) {
+    if (value && value->getProperty(value->getPrimaryKey()).toLongLong()
+            > -1) {
+        QVariant var;
+        var.setValue<QSharedPointer<Entity>>(value);
+        property.write(entity.data(), var);
+    }
+}
+
+void EntityHelper::setProperty(const QSharedPointer<Entity> &entity, QSharedPointer<Entity> value, const QString property) {
+    auto props = EntityHelper::getMetaProperties(entity.data());
+    if(props.contains(property)) {
+        QVariant var;
+        var.setValue<QSharedPointer<Entity>>(value);
+        entity->setProperty(property,var);
+    }
+}
+
+QMetaProperty EntityHelper::mappedProperty(const Relation &r,
+        const QSharedPointer<Entity> &foreignEntity) {
+    QMetaProperty prop;
+    auto props = EntityHelper::getMetaProperties(foreignEntity.data());
+    if (!r.getMappedBy().isEmpty() && props.contains(r.getMappedBy())) {
+        prop = props.value(r.getMappedBy());
+    } else {
+        auto relations = foreignEntity->getRelations();
+        for (auto iterator = relations.constBegin(); iterator != relations.constEnd();
+                ++iterator) {
+            auto rel = iterator.value();
+            if (rel.getMappedBy() == r.getPropertyName()) {
+                prop = props.value(rel.getPropertyName());
+                break;
+            }
+        }
+    }
+    return prop;
+}
diff --git a/src/entityhelper.h b/src/entityhelper.h
new file mode 100644
index 0000000..092635f
--- /dev/null
+++ b/src/entityhelper.h
@@ -0,0 +1,42 @@
+#ifndef ENTITYHELPER_H
+#define ENTITYHELPER_H
+#include <QString>
+#include <QHash>
+#include <QMetaProperty>
+namespace CuteEntityManager {
+
+class Relation;
+class Entity;
+class Cache;
+class EntityHelper
+{
+public:
+    EntityHelper();
+    static const QHash<QString, Relation> getNonInheritedRelations(const Entity *entity);
+    static const QList<const QMetaObject *> superClasses(const Entity *entity,bool stopAtSingleTableInheritance
+                                                         = false);
+    static const QHash<QString, QMetaProperty> getMetaProperties(const Entity *entity);
+    static const QHash<QString, QMetaProperty> getSuperMetaProperties(const Entity *entity);
+    static const QHash<QString, QMetaProperty> getMetaProperties(const QMetaObject *object);
+    static const QHash<QString, QMetaProperty> getInheritedMetaProperties(const Entity *entity);
+    static const QHash<Relation, QMetaProperty> getRelationProperties(const Entity *entity);
+
+    static const char *getClassname(const Entity *entity);
+    static const QString getClassName(const Entity *entity);
+    static void addEntityToListProperty(const QSharedPointer<Entity> &entity,
+                                 QSharedPointer<Entity> add, const QMetaProperty &property);
+    static void setListProperty(const QSharedPointer<Entity> &entity,
+                         QList<QSharedPointer<Entity>> &list,
+                         const QMetaProperty &property);
+    static void setProperty(const QSharedPointer<Entity> &entity,
+                     QSharedPointer<Entity> value,
+                     const QMetaProperty &property);
+    static void setProperty(const QSharedPointer<Entity> &entity,
+                     QSharedPointer<Entity> value,
+                     const QString property);
+    static QMetaProperty mappedProperty(const Relation &r,
+                                 const QSharedPointer<Entity> &foreignEntity) ;
+};
+}
+
+#endif // ENTITYHELPER_H
diff --git a/src/entityinstancefactory.cpp b/src/entityinstancefactory.cpp
index d4f09a9..94cda59 100644
--- a/src/entityinstancefactory.cpp
+++ b/src/entityinstancefactory.cpp
@@ -15,6 +15,7 @@
  */
 #include "entityinstancefactory.h"
 #include "entity.h"
+#include "entityhelper.h"
 #include <QMetaType>
 using namespace CuteEntityManager;
 EntityInstanceFactory::EntityInstanceFactory() {
@@ -77,7 +78,7 @@ Entity *EntityInstanceFactory::setAttributes(Entity *&e,
                         prop.write(e, iterator.value());
                     }
                 } else {
-                    qDebug() << prop.name() << "on Entity" << e->getClassname() << "not writeable!";
+                    qDebug() << prop.name() << "on Entity" << EntityHelper::getClassname(e) << "not writeable!";
                 }
             }
             ++iterator;
@@ -89,7 +90,7 @@ Entity *EntityInstanceFactory::setAttributes(Entity *&e,
 Entity *EntityInstanceFactory::setAttributes(Entity *&e,
         const QHash<QString, QVariant> &attributes) {
     if (!attributes.isEmpty()) {
-        auto metaprops = e->getMetaProperties();
+        auto metaprops = EntityHelper::getMetaProperties(e);
         return EntityInstanceFactory::setAttributes(e, attributes, metaprops);
     } else {
         return e;
diff --git a/src/entitymanager.cpp b/src/entitymanager.cpp
index 7b6a810..5f50cfd 100644
--- a/src/entitymanager.cpp
+++ b/src/entitymanager.cpp
@@ -113,7 +113,7 @@ QSharedPointer<Schema> EntityManager::getSchema() const {
 void EntityManager::refresh(QSharedPointer<Entity> &entity) {
     entity = this->findById(entity->getProperty(
                                 entity->getPrimaryKey()).toLongLong(),
-                            QString(entity->getClassname()));
+                            EntityHelper::getClassName(entity.data()));
 }
 
 void EntityManager::setSchema(const QSharedPointer<Schema> &value) {
@@ -147,10 +147,10 @@ QSharedPointer<Entity> EntityManager::findById(const qint64 &id,
         const bool refresh) {
     QSharedPointer<Entity> r;
     if (!e.isNull() && (refresh
-                        || !(r = this->cache.get(id, QString(e->getClassname()))))) {
+                        || !(r = this->cache.get(id, EntityHelper::getClassname(e.data()))))) {
         e->setId(id);
         auto map  = this->findByPk(id, e);
-        r = this->convert(map, e->getClassname(), refresh);
+        r = this->convert(map, EntityHelper::getClassname(e.data()), refresh);
     }
     return r;
 }
@@ -162,28 +162,6 @@ QSharedPointer<Entity> EntityManager::findById(const qint64 &id,
     return this->findById(id, e);
 }
 
-QSharedPointer<Entity> EntityManager::convert(const QHash<QString, QVariant>
-        &map,
-        const char *classname, const bool refresh) {
-    auto ptr = QSharedPointer<Entity>(EntityInstanceFactory::createInstance(
-                                          classname, map));
-    this->cache.insert(ptr);
-    this->resolveRelations(ptr, map, refresh);
-    return ptr;
-}
-
-QList<QSharedPointer<Entity> > EntityManager::convert(
-    QList<QHash<QString, QVariant> > maps,
-    const char *classname, const bool refresh) {
-    auto list = QList<QSharedPointer<Entity> >();
-    for (int var = 0; var < maps.size(); ++var) {
-        auto ptr = this->convert(maps.at(var), classname, refresh);
-        list.append(ptr);
-        this->cache.insert(ptr);
-    }
-    return list;
-}
-
 void EntityManager::manyToOne(const QSharedPointer<Entity> &entity,
                               const QVariant &id,
                               const QMetaProperty &property, const bool refresh) {
@@ -197,7 +175,7 @@ void EntityManager::manyToOne(const QSharedPointer<Entity> &entity,
                          && (ptr = this->cache.get(convertedId, className)) && ptr)) {
             ptr = this->findById(convertedId, className);
         }
-        this->setProperty(entity, ptr, property);
+        EntityHelper::setProperty(entity, ptr, property);
     }
 }
 
@@ -213,8 +191,8 @@ void EntityManager::oneToMany(const QSharedPointer<Entity> &entity,
                           this->schema->getQueryBuilder()->generateColumnNameID(r.getMappedBy()),
                           entity->getId());
             auto listMap = this->convertQueryResult(q);
-            auto entities = this->convert(listMap, e->getClassname(), refresh);
-            this->setListProperty(entity, entities, property);
+            auto entities = this->convert(listMap, EntityHelper::getClassname(e.data()), refresh);
+            EntityHelper::setListProperty(entity, entities, property);
         }
     }
 }
@@ -236,10 +214,10 @@ void EntityManager::oneToOne(const QSharedPointer<Entity> &entity,
                                   r.getMappedBy()),
                               entity->getProperty(entity->getPrimaryKey()).toLongLong(), 1);
             auto listMap = this->convertQueryResult(q);
-            auto entities = this->convert(listMap, e->getClassname(), refresh);
+            auto entities = this->convert(listMap, EntityHelper::getClassname(e.data()), refresh);
             if (!entities.isEmpty()) {
                 QSharedPointer<Entity> ptr = entities.at(0);
-                this->setProperty(entity, ptr, property);
+                EntityHelper::setProperty(entity, ptr, property);
             }
         }
     }
@@ -250,40 +228,9 @@ bool EntityManager::canPersistRelation(const Relation &relation,
     return relation.getType() == r  && var.canConvert<QVariantList>();
 }
 
-void EntityManager::setListProperty(const QSharedPointer<Entity> &entity,
-                                    QList<QSharedPointer<Entity> > &list,
-                                    const QMetaProperty &property) const {
-    QVariant var;
-    var.setValue<QList<QSharedPointer<Entity>>>(list);
-    property.write(entity.data(),var);
-}
-
-void EntityManager::addEntityToListProperty(const QSharedPointer<Entity>
-        &entity, QSharedPointer<Entity> add, const QMetaProperty &property) {
-    QVariant var = property.read(entity.data());
-    if (!var.isNull() && var.canConvert<QList<QVariant>>()) {
-        auto list = EntityInstanceFactory::castQVariantList(var);
-        if (!list.contains(add)) {
-            list.append(add);
-            this->setListProperty(entity, list, property);
-        }
-    }
-}
-
-void EntityManager::setProperty(const QSharedPointer<Entity> &entity,
-                                QSharedPointer<Entity> value,
-                                const QMetaProperty &property) const {
-    if (value && value->getProperty(value->getPrimaryKey()).toLongLong()
-            > -1) {
-        QVariant var;
-        var.setValue<QSharedPointer<Entity>>(value);
-        property.write(entity.data(), var);
-    }
-}
-
 void EntityManager::savePrePersistedRelations(const QSharedPointer<Entity>
         &entity) {
-    auto relations = entity->getRelationProperties();
+    auto relations = EntityHelper::getRelationProperties(entity.data());
     auto iterator = relations.constBegin();
     while (iterator != relations.constEnd()) {
         const Relation r = iterator.key();
@@ -293,11 +240,22 @@ void EntityManager::savePrePersistedRelations(const QSharedPointer<Entity>
                 auto e = EntityInstanceFactory::castQVariant(var);
                 if (this->shouldBeSaved(e, r)) {
                     this->save(e);
+                    if(!r.getMappedBy().isEmpty()) {
+                        auto props = EntityHelper::getMetaProperties(e.data());
+                        if(props.contains(r.getMappedBy())) {
+                            EntityHelper::addEntityToListProperty(e,entity,props.value(r.getMappedBy()));
+                        }
+                    }
                 }
-            } else if (r.getType() == RelationType::ONE_TO_ONE
-                       && r.getMappedBy().isEmpty()) {
-                auto entity =  EntityInstanceFactory::castQVariant(var);
-                this->save(entity);
+            } else if (r.getType() == RelationType::ONE_TO_ONE) {
+                auto e =  EntityInstanceFactory::castQVariant(var);
+                this->save(e);
+                /**
+                  @todo find relation of the other entity
+                  */
+//                if(!r.getMappedBy().isEmpty()) {
+//                    e->setProperty(r.getMappedBy(),entity);
+//                }
             }
         }
         ++iterator;
@@ -306,7 +264,7 @@ void EntityManager::savePrePersistedRelations(const QSharedPointer<Entity>
 
 void EntityManager::savePostPersistedRelations(const QSharedPointer<Entity>
         &entity) {
-    auto relations = entity->getRelationProperties();
+    auto relations = EntityHelper::getRelationProperties(entity.data());
     auto iterator = relations.constBegin();
     while (iterator != relations.constEnd()) {
         const Relation r = iterator.key();
@@ -317,16 +275,22 @@ void EntityManager::savePostPersistedRelations(const QSharedPointer<Entity>
             } else if (this->canPersistRelation(r, RelationType::ONE_TO_MANY, var)) {
                 QList<QSharedPointer<Entity>> list = EntityInstanceFactory::castQVariantList(
                         var);
+                if(!list.isEmpty()) {
+                    //auto foreignEntityProps = list.at(0)->getMetaProperties();
+                    //QString propertyName = r.getMappedBy() ||
+
                 for (int var = 0; var < list.size(); ++var) {
-                    auto entity = list.at(var);
-                    if (this->shouldBeSaved(entity, r)) {
-                        this->save(entity);
+                    auto e = list.at(var);
+                    if (this->shouldBeSaved(e, r)) {
+                        this->save(e);
                     }
+                    //this->addEntityToListProperty();
+                }
                 }
             } else if (r.getType() == RelationType::ONE_TO_ONE
                        && !r.getMappedBy().isEmpty()) {
-                auto entity =  EntityInstanceFactory::castQVariant(var);
-                this->save(entity);
+                auto e =  EntityInstanceFactory::castQVariant(var);
+                this->save(e);
             }
         }
         ++iterator;
@@ -350,7 +314,7 @@ void EntityManager::persistMappedByRelation(const QList<QSharedPointer<Entity> >
                                   builder->generateManyToManyColumnName(entity),
                                   builder->generateManyToManyColumnName(ptr));
     q.bindValue(0, entity->getProperty(entity->getPrimaryKey()));
-    auto prop = this->mappedProperty(r, ptr);
+    auto prop = EntityHelper::mappedProperty(r, ptr);
     QSharedPointer<Entity> item;
     for (int var = 0; var < saved.size(); ++var) {
         item = list.at(var);
@@ -358,12 +322,12 @@ void EntityManager::persistMappedByRelation(const QList<QSharedPointer<Entity> >
             q.bindValue(1, item->getProperty(ptr->getPrimaryKey()));
             this->schema->getDatabase()->exec(q);
             if (prop.isReadable()) {
-                this->addEntityToListProperty(ptr, entity, prop);
+                EntityHelper::addEntityToListProperty(ptr, entity, prop);
             } else {
                 qDebug() << "Query exec for many to many relation failed." <<
                          q.lastError().text();
-                qDebug() << "Involved entities: " << entity->getClassname() <<
-                         "(MainEntitiy) and "  << ptr->getClassname();
+                qDebug() << "Involved entities: " << EntityHelper::getClassName(entity.data()) <<
+                         "(MainEntitiy) and "  << EntityHelper::getClassName(ptr.data());
                 qDebug() << "Relation:" << r.getPropertyName();
             }
         }
@@ -373,27 +337,6 @@ void EntityManager::persistMappedByRelation(const QList<QSharedPointer<Entity> >
     }
 }
 
-
-QMetaProperty EntityManager::mappedProperty(const Relation &r,
-        const QSharedPointer<Entity> &foreignEntity) const {
-    QMetaProperty prop;
-    auto props = foreignEntity->getMetaProperties();
-    if (!r.getMappedBy().isEmpty() && props.contains(r.getMappedBy())) {
-        prop = props.value(r.getMappedBy());
-    } else {
-        auto relations = foreignEntity->getRelations();
-        for (auto iterator = relations.constBegin(); iterator != relations.constEnd();
-                ++iterator) {
-            auto rel = iterator.value();
-            if (rel.getMappedBy() == r.getPropertyName()) {
-                prop = props.value(rel.getPropertyName());
-                break;
-            }
-        }
-    }
-    return prop;
-}
-
 bool EntityManager::shouldBeSaved(QSharedPointer<Entity> &entity,
                                   const Relation &r) {
     return entity && (r.getCascadeType().contains(CascadeType::ALL)
@@ -404,7 +347,7 @@ bool EntityManager::shouldBeSaved(QSharedPointer<Entity> &entity,
 }
 
 void EntityManager::removeRelations(const QSharedPointer<Entity> &entity) {
-    auto props = entity->getRelationProperties();
+    auto props = EntityHelper::getRelationProperties(entity.data());
     auto iterator = props.constBegin();
     while (iterator != props.constEnd()) {
         const Relation r = iterator.key();
@@ -433,11 +376,11 @@ void EntityManager::setNullOneToManyRelation(QVariant &var, const Relation &r) {
             && var.canConvert<QVariantList>()) {
         auto list = EntityInstanceFactory::castQVariantList(var);
         if (!list.isEmpty()) {
-            auto metas = list.at(0)->getMetaProperties();
+            auto metas = EntityHelper::getMetaProperties(list.at(0).data());
             if (metas.contains(r.getMappedBy())) {
                 for (int var = 0; var < list.size(); ++var) {
                     auto entity = list.at(var);
-                    this->setProperty(entity, QSharedPointer<Entity>(),
+                    EntityHelper::setProperty(entity, QSharedPointer<Entity>(),
                                       metas.value(r.getMappedBy()));
                     this->save(entity);
                 }
@@ -453,15 +396,14 @@ void EntityManager::setNullEntityPropertyRelation(QVariant &var,
         this->removeEntity(var);
     } else if (!r.getMappedBy().isEmpty() && !var.isNull()) {
         auto e = EntityInstanceFactory::castQVariant(var);
-        auto metas = e->getMetaProperties();
+        auto metas = EntityHelper::getMetaProperties(e.data());
         if (metas.contains(r.getMappedBy())) {
-            this->setProperty(e, QSharedPointer<Entity>(), metas.value(r.getMappedBy()));
+            EntityHelper::setProperty(e, QSharedPointer<Entity>(), metas.value(r.getMappedBy()));
             this->save(e);
         }
     }
 }
 
-
 void EntityManager::removeEntity(QVariant &var) {
     if (!var.isNull()) {
         auto e = EntityInstanceFactory::castQVariant(var);
@@ -570,18 +512,18 @@ void EntityManager::manyToMany(const QSharedPointer<Entity> &entity,
                 auto id = listMap.at(var).value(builder->generateManyToManyColumnName(
                                                     secEntityPtr));
                 if (!refresh
-                        && this->cache.contains(id.toLongLong(), secEntityPtr->getClassname())) {
-                    auto entity2 = this->cache.get(id.toLongLong(), secEntityPtr->getClassname());
+                        && this->cache.contains(id.toLongLong(), EntityHelper::getClassname(secEntityPtr.data()))) {
+                    auto entity2 = this->cache.get(id.toLongLong(), EntityHelper::getClassname(secEntityPtr.data()));
                     entities.append(entity2);
                     //this->addEntityToListProperty(entity,entity2,property);
                 } else {
-                    auto entity2 = this->findById(id.toLongLong(), secEntityPtr->getClassname());
+                    auto entity2 = this->findById(id.toLongLong(), EntityHelper::getClassname(secEntityPtr.data()));
                     //this->addEntityToListProperty(entity,entity2,property);
                     entities.append(entity2);
                 }
             }
             if(!entities.isEmpty()) {
-            this->setListProperty(entity, entities, property);
+            EntityHelper::setListProperty(entity, entities, property);
             }
         } else {
             qDebug() << "MANY_TO_MANY Table " << tblName << " not exists";
@@ -594,7 +536,7 @@ QList<QSharedPointer<Entity> > EntityManager::findEntityByAttributes(
     &entity,
     bool ignoreID) {
     auto maps = this->findAllByAttributes(entity, ignoreID);
-    return this->convert(maps, entity->getClassname());
+    return this->convert(maps, EntityHelper::getClassname(entity.data()));
 }
 
 /**
@@ -635,7 +577,7 @@ bool EntityManager::create(QSharedPointer<Entity> &entity,
             rc = this->db->exec(query);
             if (!rc) {
                 qDebug() << "Query failed:" << query.lastError().text() << " of class " <<
-                         entity->getClassname();
+                         EntityHelper::getClassname(entity.data());
                 break;
             }
             if (first) {
@@ -743,7 +685,7 @@ QList<QHash <QString, QVariant> > EntityManager::findAll(
 
 void EntityManager::resolveRelations(const QSharedPointer<Entity> &entity,
                                      const QHash<QString, QVariant> &map, const bool refresh) {
-    auto props = entity->getRelationProperties();
+    auto props = EntityHelper::getRelationProperties(entity.data());
     auto iterator = props.constBegin();
     while (iterator != props.constEnd()) {
         const Relation r = iterator.key();
@@ -846,3 +788,25 @@ qint8 EntityManager::count(const QString &tableName) {
 void EntityManager::setConnectionNames(QStringList list) {
     EntityManager::connectionNames = list;
 }
+
+QSharedPointer<Entity> EntityManager::convert(const QHash<QString, QVariant>
+        &map,
+        const char *classname,const bool refresh) {
+    auto ptr = QSharedPointer<Entity>(EntityInstanceFactory::createInstance(
+                                          classname, map));
+    this->cache.insert(ptr);
+    this->resolveRelations(ptr, map, refresh);
+    return ptr;
+}
+
+QList<QSharedPointer<Entity> > EntityManager::convert(
+    QList<QHash<QString, QVariant> > maps,
+    const char *classname,const bool refresh) {
+    auto list = QList<QSharedPointer<Entity> >();
+    for (int var = 0; var < maps.size(); ++var) {
+        auto ptr = this->convert(maps.at(var), classname, refresh);
+        list.append(ptr);
+        this->cache.insert(ptr);
+    }
+    return list;
+}
diff --git a/src/entitymanager.h b/src/entitymanager.h
index 7522cb3..deb9517 100644
--- a/src/entitymanager.h
+++ b/src/entitymanager.h
@@ -98,7 +98,7 @@ class EntityManager : public QObject {
                                      (EntityInstanceFactory::createInstance<T>());
         if (ptr) {
             auto maps = this->findAll(ptr);
-            return this->convert(maps, ptr->getClassname());
+            return this->convert(maps, EntityHelper::getClassname(ptr.data()));
         }
         return QList<QSharedPointer<Entity>>();
     }
@@ -126,7 +126,7 @@ class EntityManager : public QObject {
                                    (EntityInstanceFactory::createInstance<T>());
         if (e) {
             auto results = this->findAllByAttributes(attributes, e->getTablename());
-            auto list = this->convert(results, e->getClassname());
+            auto list = this->convert(results, EntityHelper::getClassname(e.data()));
             return list;
         }
         return QList<QSharedPointer<Entity>>();
@@ -138,7 +138,7 @@ class EntityManager : public QObject {
         if (e) {
             QSqlQuery q = this->db.data()->select(sql);
             auto result = this->convertQueryResult(q);
-            auto ret = this->convert(result, e->getClassname());
+            auto ret = this->convert(result, EntityHelper::getClassname(e));
             delete e;
             return ret;
         }
@@ -172,10 +172,6 @@ class EntityManager : public QObject {
     void resolveRelations(const QSharedPointer<Entity> &entity,
                           const QHash<QString, QVariant> &map, const bool refresh = false);
     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,
-                                          const char *classname, const bool refresh = false);
     void manyToOne(const QSharedPointer<Entity> &entity, const QVariant &id,
                    const QMetaProperty &property, const bool refresh = false);
     void oneToMany(const QSharedPointer<Entity> &entity, const Relation &r,
@@ -198,14 +194,6 @@ class EntityManager : public QObject {
             bool ignoreID = false);
     QSharedPointer<Entity> findById(const qint64 &id, QSharedPointer<Entity> &e,
                                     const bool refresh = false);
-    void addEntityToListProperty(const QSharedPointer<Entity> &entity,
-                                 QSharedPointer<Entity> add, const QMetaProperty &property);
-    void setListProperty(const QSharedPointer<Entity> &entity,
-                         QList<QSharedPointer<Entity>> &list,
-                         const QMetaProperty &property) const;
-    void setProperty(const QSharedPointer<Entity> &entity,
-                     QSharedPointer<Entity> value,
-                     const QMetaProperty &property) const;
     void savePrePersistedRelations(const QSharedPointer<Entity> &entity);
     void savePostPersistedRelations(const QSharedPointer<Entity> &entity);
 
@@ -223,8 +211,10 @@ class EntityManager : public QObject {
     void removeEntity(QVariant &var);
     void setNullOneToManyRelation(QVariant &var, const Relation &r);
     void setNullEntityPropertyRelation(QVariant &var, const Relation &r);
-    QMetaProperty mappedProperty(const Relation &r,
-                                 const QSharedPointer<Entity> &foreignEntity) const;
+    QSharedPointer<Entity> convert(const QHash<QString, QVariant> &map,
+                                   const char *classname,const bool refresh = false);
+    QList<QSharedPointer<Entity>> convert(QList<QHash<QString, QVariant> > maps,
+                                          const char *classname,const bool refresh = false);
 
   private:
     static QStringList connectionNames;
diff --git a/src/querybuilder.cpp b/src/querybuilder.cpp
index 1bd2893..9c4f88c 100644
--- a/src/querybuilder.cpp
+++ b/src/querybuilder.cpp
@@ -19,6 +19,7 @@
 #include "entity.h"
 #include <QRegularExpression>
 #include "entityinstancefactory.h"
+#include "entityhelper.h"
 
 using namespace CuteEntityManager;
 
@@ -40,14 +41,14 @@ bool QueryBuilder::createTable(const QSharedPointer<Entity> &entity,
         this->schema->containsTable(tableName) ? rc = true : rc = false;
         if (!rc) {
             QSqlQuery q = this->database->getQuery(this->createTable(tableName,
-                                                   tableDefinition));
+                                                                     tableDefinition));
             if (this->database->exec(q)) {
                 if (createRelationTables) {
                     auto relTables = this->generateRelationTables(entity);
                     auto i = relTables.constBegin();
                     while (i != relTables.constEnd()) {
                         auto query = this->database->getQuery(this->createTable(i.key(),
-                                                              i.value()));
+                                                                                i.value()));
                         this->database->exec(query);
                         ++i;
                     }
@@ -80,20 +81,20 @@ QStringList QueryBuilder::relationFks(const QSharedPointer<Entity> &entity)
 const {
     QStringList queries = QStringList();
     if (this->supportsForeignKeys()) {
-        auto relations = entity->getNonInheritedRelations();
-        auto props = entity->getMetaProperties();
+        auto relations = EntityHelper::getNonInheritedRelations(entity.data());
+        auto props = EntityHelper::getMetaProperties(entity.data());
         auto iterator = relations.constBegin();
         while (iterator != relations.constEnd()) {
             auto relation = iterator.value();
             if (relation.getMappedBy().isEmpty() && !relation.getCascadeType().isEmpty()) {
                 QString update = relation.getCascadeType().contains(CascadeType::MERGE)
-                                 || relation.getCascadeType().contains(CascadeType::ALL) ?
-                                 this->getForeignKeyCascade(
-                                     CASCADE) : this->getForeignKeyCascade(NO_ACTION);
+                        || relation.getCascadeType().contains(CascadeType::ALL) ?
+                            this->getForeignKeyCascade(
+                                CASCADE) : this->getForeignKeyCascade(NO_ACTION);
                 QString remove = relation.getCascadeType().contains(CascadeType::REMOVE)
-                                 || relation.getCascadeType().contains(CascadeType::ALL) ?
-                                 this->getForeignKeyCascade(
-                                     CASCADE) : this->getForeignKeyCascade(DbForeignKeyCascade::SET_NULL);
+                        || relation.getCascadeType().contains(CascadeType::ALL) ?
+                            this->getForeignKeyCascade(
+                                CASCADE) : this->getForeignKeyCascade(DbForeignKeyCascade::SET_NULL);
                 this->createRelationFK(queries, entity, relation,
                                        props.value(relation.getPropertyName()), update, remove);
             }
@@ -112,14 +113,14 @@ void QueryBuilder::createRelationFK(QStringList &queries,
                                     const QMetaProperty &metaProperty, const QString &update,
                                     const QString &remove) const {
     auto ptr = QSharedPointer<Entity>
-               (EntityInstanceFactory::createInstance(metaProperty.type()));
+            (EntityInstanceFactory::createInstance(metaProperty.type()));
     if (ptr) {
         if (relation.getType() == RelationType::ONE_TO_ONE
                 || relation.getType() == RelationType::MANY_TO_ONE) {
             QString indexName = this->generateIndexName(relation.getPropertyName(),
-                                entity->getTablename(),
-                                this->generateColumnNameID(relation.getPropertyName()),
-                                ptr->getTablename(), true);
+                                                        entity->getTablename(),
+                                                        this->generateColumnNameID(relation.getPropertyName()),
+                                                        ptr->getTablename(), true);
             queries.append(this->addForeignKey(indexName, entity->getTablename(),
                                                QStringList(this->generateColumnNameID(relation.getPropertyName())),
                                                ptr->getTablename(),
@@ -128,20 +129,20 @@ void QueryBuilder::createRelationFK(QStringList &queries,
         } else if (relation.getType() == RelationType::MANY_TO_MANY) {
             QString tableName = this->generateManyToManyTableName(entity, ptr, relation);
             queries.append(this->createForeignKeyManyToMany(tableName, entity, update,
-                           remove));
+                                                            remove));
             queries.append(this->createForeignKeyManyToMany(tableName, ptr, update,
-                           remove));
+                                                            remove));
         }
     }
 }
 
 QString QueryBuilder::createForeignKeyManyToMany(const QString &tableName,
-        const QSharedPointer<Entity> &entity, const QString &update,
-        const QString &remove) const {
+                                                 const QSharedPointer<Entity> &entity, const QString &update,
+                                                 const QString &remove) const {
     QString fkColumn = this->generateManyToManyColumnName(entity);
     QString indexName = this->generateIndexName(fkColumn,
-                        tableName, fkColumn,
-                        entity->getTablename(), true);
+                                                tableName, fkColumn,
+                                                entity->getTablename(), true);
     return this->addForeignKey(indexName, tableName, QStringList(fkColumn),
                                entity->getTablename(), QStringList(entity->getPrimaryKey()),
                                remove, update);
@@ -160,12 +161,12 @@ QString QueryBuilder::createFkSuperClass(const Entity *e) const {
             && QString(superMetaObject->className()) !=
             this->entityClassname()) {
         Entity *superClass  = EntityInstanceFactory::createInstance(
-                                  superMetaObject->className());
+                    superMetaObject->className());
         if (superClass) {
             QString refColumn = superClass->getPrimaryKey();
             QString refTable = superClass->getTablename();
             r = this->addForeignKey(this->generateIndexName(e->getPrimaryKey(),
-                                    e->getTablename(), refColumn, refTable, true), e->getTablename(),
+                                                            e->getTablename(), refColumn, refTable, true), e->getTablename(),
                                     QStringList(e->getPrimaryKey()), refTable, QStringList(refColumn),
                                     this->getForeignKeyCascade(CASCADE),
                                     this->getForeignKeyCascade(CASCADE));
@@ -188,8 +189,8 @@ QString QueryBuilder::createTableQuery(const QString &tableName,
             s.append(", ");
         }
         s.append(this->schema->quoteColumnName(i.key())).append(" " +
-                this->getColumnType(
-                    i.value()));
+                                                                this->getColumnType(
+                                                                    i.value()));
         ++i;
     }
     s.append(");");
@@ -198,9 +199,9 @@ QString QueryBuilder::createTableQuery(const QString &tableName,
 
 QString QueryBuilder::renameTable(QString tableName, QString newName) const {
     return "RENAME TABLE " + this->schema->quoteTableName(
-               tableName) + " TO " +
-           this->schema->quoteTableName(
-               newName);
+                tableName) + " TO " +
+            this->schema->quoteTableName(
+                newName);
 }
 
 QString QueryBuilder::dropTable(QString tableName) const {
@@ -214,46 +215,46 @@ QString QueryBuilder::truncateTable(QString tableName) const {
 QString QueryBuilder::addColumn(QString tableName, QString columnName,
                                 QString columnType) const {
     return "ALTER TABLE " + this->schema->quoteTableName(
-               tableName) + " ADD " +
-           this->schema->quoteColumnName(
-               columnName) + " " + this->getColumnType(columnType);
+                tableName) + " ADD " +
+            this->schema->quoteColumnName(
+                columnName) + " " + this->getColumnType(columnType);
 }
 
 QString QueryBuilder::dropColumn(QString tableName, QString columName) const {
     return "ALTER TABLE " + this->schema->quoteTableName(
-               tableName) + " DROP COLUMN " +
-           this->schema->quoteColumnName(columName);
+                tableName) + " DROP COLUMN " +
+            this->schema->quoteColumnName(columName);
 }
 
 QString QueryBuilder::renameColumn(QString tableName, QString oldName,
                                    QString newName) const {
     return "ALTER TABLE " + this->schema->quoteTableName(
-               tableName) + " RENAME COLUMN " +
-           this->schema->quoteColumnName(oldName) + " TO " +
-           this->schema->quoteColumnName(
-               newName);
+                tableName) + " RENAME COLUMN " +
+            this->schema->quoteColumnName(oldName) + " TO " +
+            this->schema->quoteColumnName(
+                newName);
 }
 
 QString QueryBuilder::alterColumn(QString tableName, QString columnName,
                                   QString newType) const {
     return "ALTER TABLE " + this->schema->quoteTableName(
-               tableName) + " CHANGE " +
-           this->schema->quoteColumnName(columnName) + " " +
-           this->schema->quoteColumnName(columnName) + this->getColumnType(newType);
+                tableName) + " CHANGE " +
+            this->schema->quoteColumnName(columnName) + " " +
+            this->schema->quoteColumnName(columnName) + this->getColumnType(newType);
 }
 
 QString QueryBuilder::addPrimaryKey(QString name, QString tableName,
                                     QStringList columns) const {
     return "ALTER TABLE " + this->schema->quoteTableName(
-               tableName) + " ADD CONSTRAINT " +
-           this->schema->quoteColumnName(name) + "PRIMARY KEY (" +
-           this->buildColumns(columns) + " )";
+                tableName) + " ADD CONSTRAINT " +
+            this->schema->quoteColumnName(name) + "PRIMARY KEY (" +
+            this->buildColumns(columns) + " )";
 }
 
 QString QueryBuilder::dropPrimaryKey(QString name, QString tableName) const {
     return "ALTER TABLE " + this->schema->quoteTableName(
-               tableName) + " DROP CONSTRAINT " +
-           this->schema->quoteColumnName(name);
+                tableName) + " DROP CONSTRAINT " +
+            this->schema->quoteColumnName(name);
 }
 
 QString QueryBuilder::addForeignKey(QString name, QString tableName,
@@ -262,12 +263,12 @@ QString QueryBuilder::addForeignKey(QString name, QString tableName,
                                     QStringList refColumns, QString deleteConstraint,
                                     QString updateConstraint) const {
     QString r = "ALTER TABLE " + this->schema->quoteTableName(
-                    tableName) + "ADD CONSTRAINT " +
-                this->schema->quoteColumnName(name)
-                + " FOREIGN KEY (" +  this->buildColumns(columns) + ")" + " REFERENCES " +
-                this->schema->quoteTableName(
-                    refTableName) +
-                " (" + this->buildColumns(refColumns) + ")";
+                tableName) + "ADD CONSTRAINT " +
+            this->schema->quoteColumnName(name)
+            + " FOREIGN KEY (" +  this->buildColumns(columns) + ")" + " REFERENCES " +
+            this->schema->quoteTableName(
+                refTableName) +
+            " (" + this->buildColumns(refColumns) + ")";
     if (!deleteConstraint.isEmpty()) {
         r.append(" ON DELETE " + deleteConstraint);
     }
@@ -281,7 +282,7 @@ QString QueryBuilder::generateIndexName(const QString &name,
                                         const QString &table, const QString &refColumn, const QString &refTable,
                                         const bool fk) const {
     return QString(fk ? "fk" : "idx").append("_").append(name).append(table).append(
-               refColumn).append(refTable);
+                refColumn).append(refTable);
 }
 
 QString QueryBuilder::generateColumnNameID(QString name) const {
@@ -312,16 +313,16 @@ QString QueryBuilder::getForeignKeyCascade(DbForeignKeyCascade cascade) const {
 
 QString QueryBuilder::dropForeignKey(QString name, QString tableName) const {
     return "ALTER TABLE " + this->schema->quoteTableName(
-               tableName) + " DROP CONSTRAINT " +
-           this->schema->quoteColumnName(name);
+                tableName) + " DROP CONSTRAINT " +
+            this->schema->quoteColumnName(name);
 }
 
 QString QueryBuilder::createIndex(QString name, QString tableName,
                                   QStringList columns,
                                   bool unique) const {
     QString s = (unique ? "CREATE UNIQUE INDEX " : "CREATE INDEX ") +
-                this->schema->quoteTableName(
-                    name) + " ON " + this->schema->quoteTableName(tableName) + " (";
+            this->schema->quoteTableName(
+                name) + " ON " + this->schema->quoteTableName(tableName) + " (";
     s.append(this->buildColumns(columns));
     s.append(");");
     return s;
@@ -329,8 +330,8 @@ QString QueryBuilder::createIndex(QString name, QString tableName,
 
 QString QueryBuilder::dropIndex(QString name, QString tableName) const {
     return "DROP INDEX " + this->schema->quoteTableName(name) + " ON " +
-           this->schema->quoteTableName(
-               tableName);
+            this->schema->quoteTableName(
+                tableName);
 }
 
 QSharedPointer<Database> QueryBuilder::getDatabase() const {
@@ -363,17 +364,17 @@ QString QueryBuilder::buildCreateQuery(QHash<QString, QVariant>::const_iterator
 }
 
 QHash<QString, QString> QueryBuilder::generateTableDefinition(
-    const QSharedPointer<Entity> &entity)
+        const QSharedPointer<Entity> &entity)
 const {
     auto map = QHash<QString, QString>();
     auto o = entity->metaObject();
     auto superMetaObject = entity->metaObject()->superClass();
-    auto superMetaObjectPropertyMap = entity->getSuperMetaProperties();
+    auto superMetaObjectPropertyMap = EntityHelper::getSuperMetaProperties(entity.data());
     QHash<QString, Relation> relations = entity->getRelations();
     for (int var = 0; var < o->propertyCount(); ++var) {
         auto m = o->property(var);
         if ((!superMetaObjectPropertyMap.contains(QString(m.name()))
-                || entity->getInheritanceStrategy() == InheritanceStrategy::PER_CLASS_TABLE)
+             || entity->getInheritanceStrategy() == InheritanceStrategy::PER_CLASS_TABLE)
                 && m.name() != QString("objectName") && m.isReadable()
                 && !entity->getTransientAttributes().contains(m.name())) {
             if (m.isEnumType()) {
@@ -408,8 +409,8 @@ const {
 }
 
 QString QueryBuilder::generateManyToManyTableName(const QSharedPointer<Entity>
-        &firstEntity,
-        const QSharedPointer<Entity> &secondEntity, const Relation &r) const {
+                                                  &firstEntity,
+                                                  const QSharedPointer<Entity> &secondEntity, const Relation &r) const {
     if (r.getMappedBy().isEmpty()) {
         return firstEntity->getTablename() + "_" + r.getPropertyName();
     } else {
@@ -422,7 +423,7 @@ QHash<QString, QHash<QString, QString>> QueryBuilder::generateRelationTables(
 const {
     auto relations = QHash<QString, QHash<QString, QString>>();
     QHash<QString, Relation> m = entity->getRelations();
-    auto props = entity->getMetaProperties();
+    auto props = EntityHelper::getMetaProperties(entity.data());
     for (auto i = m.begin(); i != m.end(); ++i) {
         Relation r = i.value();
         if (r.getType() == RelationType::MANY_TO_MANY && r.getMappedBy().isEmpty()) {
@@ -432,8 +433,8 @@ const {
                      this->schema->TYPE_BIGINT);
             auto meta = props.value(r.getPropertyName());
             QSharedPointer<Entity> ptr = QSharedPointer<Entity>
-                                         (EntityInstanceFactory::createInstance(EntityInstanceFactory::extractEntityType(
-                                                 QMetaType::typeName(meta.userType()))));
+                    (EntityInstanceFactory::createInstance(EntityInstanceFactory::extractEntityType(
+                                                               QMetaType::typeName(meta.userType()))));
             h.insert(this->generateManyToManyColumnName(ptr),
                      this->schema->TYPE_BIGINT);
             relations.insert(this->generateManyToManyTableName(entity, ptr, r), h);
@@ -457,7 +458,7 @@ QString QueryBuilder::transformTypeToAbstractDbType(QString typeName) const {
 }
 
 QString QueryBuilder::transformAbstractTypeToRealDbType(
-    QString typeName) const {
+        QString typeName) const {
     return this->schema->getTypeMap()->value(typeName);
 }
 
@@ -472,10 +473,10 @@ QString QueryBuilder::getColumnType(const QString &type) const {
     //cant believe that this could work in Qt
     //https://github.com/yiisoft/yii2/blob/master/framework/db/QueryBuilder.php
     QRegularExpression reg = QRegularExpression(
-                                 QRegularExpression::escape("/^(\\w+)\((.+?)\\)(.*)$/"));
+                QRegularExpression::escape("/^(\\w+)\((.+?)\\)(.*)$/"));
     reg.optimize();
     QRegularExpressionMatchIterator i = reg.globalMatch(type, 0,
-                                        QRegularExpression::PartialPreferFirstMatch);
+                                                        QRegularExpression::PartialPreferFirstMatch);
     short s = 0;
     bool ok = false;
     QString before = "";
@@ -507,7 +508,7 @@ QString QueryBuilder::getColumnType(const QString &type) const {
 QSqlQuery QueryBuilder::find(const qint64 &id, const QString &tableName) const {
     QString pk = "id";
     QSqlQuery q = this->database->getQuery(this->selectBase(QStringList(
-            tableName)) + " WHERE " + pk + " = " + this->placeHolder(pk) + " LIMIT 1;");
+                                                                tableName)) + " WHERE " + pk + " = " + this->placeHolder(pk) + " LIMIT 1;");
     this->bindValue(pk, id, q);
     return q;
 }
@@ -536,9 +537,9 @@ QString QueryBuilder::selectBase(const QStringList &tables,
 QSqlQuery QueryBuilder::find(const qint64 &id,
                              const QSharedPointer<Entity> &entity, qint64 offset, QString pk) const {
     QSqlQuery q = this->database->getQuery(this->selectBase(QStringList(
-            entity->getTablename())) + this->joinSuperClasses(
-                    entity) + " WHERE " + this->schema->quoteColumnName(
-                            pk) + "= " + this->placeHolder(pk) + this->limit(1, offset));
+                                                                entity->getTablename())) + this->joinSuperClasses(
+                                               entity) + " WHERE " + this->schema->quoteColumnName(
+                                               pk) + "= " + this->placeHolder(pk) + this->limit(1, offset));
     this->bindValue(pk, id, q);
     return q;
 }
@@ -546,7 +547,7 @@ QSqlQuery QueryBuilder::find(const qint64 &id,
 QSqlQuery QueryBuilder::findAll(const QSharedPointer<Entity> &entity,
                                 const qint64 limit, qint64 offset) {
     return this->database->getQuery(this->selectBase(QStringList(
-                                        entity->getTablename())) + " " + this->joinSuperClasses(
+                                                         entity->getTablename())) + " " + this->joinSuperClasses(
                                         entity) + this->limit(limit, offset) + ";");
 }
 
@@ -558,20 +559,20 @@ QSqlQuery QueryBuilder::findAll(const QSharedPointer<Entity> &entity,
  * @return
  */
 QSqlQuery QueryBuilder::findByAttributes(const QHash<QString, QVariant> &m,
-        const QString &tableName,
-        const bool &ignoreID, const qint64 limit, const qint64 offset) const {
+                                         const QString &tableName,
+                                         const bool &ignoreID, const qint64 limit, const qint64 offset) const {
     QSqlQuery q = this->database->getQuery(this->selectBase(QStringList(
-            tableName)) + this->where(m, "AND", ignoreID) + this->limit(limit, offset));
+                                                                tableName)) + this->where(m, "AND", ignoreID) + this->limit(limit, offset));
     this->bindValues(m, q, ignoreID);
     return q;
 }
 
 QSqlQuery QueryBuilder::findByAttributes(const QSharedPointer<Entity> &e,
-        bool ignoreID,
-        const qint64 limit,
-        const qint64 offset) {
+                                         bool ignoreID,
+                                         const qint64 limit,
+                                         const qint64 offset) {
     QHash<QString, QVariant> values = this->getEntityAttributes(
-                                          e->getMetaProperties(), e);
+                EntityHelper::getMetaProperties(e.data()), e);
     return this->findByAttributes(values, e->getTablename(), ignoreID, limit,
                                   offset);
 }
@@ -587,7 +588,7 @@ const {
                                 entity->getProperty(entity->getPrimaryKey()).toLongLong()));
     if (entity->getInheritanceStrategy() != InheritanceStrategy::PER_CLASS_TABLE
             && entity->isInheritanceCascaded()) {
-        auto classes = entity->superClasses(true);
+        auto classes = EntityHelper::superClasses(entity.data(),true);
         for (int var = 0; var < classes.size(); ++var) {
             auto item = classes.at(var);
             auto instance = EntityInstanceFactory::createInstance(item->className());
@@ -607,21 +608,21 @@ QSqlQuery QueryBuilder::remove(const QString &tableName,
                                const qint64 &id, const QString &primaryKey) const {
     QSqlQuery q = this->database->getQuery("DELETE FROM " +
                                            this->schema->quoteTableName(
-                                                   tableName) + " WHERE " +
+                                               tableName) + " WHERE " +
                                            this->schema->quoteColumnName(primaryKey) + "=" + this->placeHolder(
-                                                   primaryKey) + ";");
+                                               primaryKey) + ";");
     this->bindValue(primaryKey, id, q);
     return q;
 }
 
 QSqlQuery QueryBuilder::findId(const QSharedPointer<Entity> &entity) const {
     QHash<QString, QVariant> values = this->getEntityAttributes(
-                                          entity->getMetaProperties(),
-                                          entity);
+                EntityHelper::getMetaProperties(entity.data()),
+                entity);
     QSqlQuery q = this->database->getQuery(this->selectBase(QStringList(
-            entity->getTablename()),
-                                           QStringList(entity->getPrimaryKey())) + this->where(values,
-                                                   "AND", true) + " LIMIT 1");
+                                                                entity->getTablename()),
+                                                            QStringList(entity->getPrimaryKey())) + this->where(values,
+                                                                                                                "AND", true) + " LIMIT 1");
     this->bindValues(values, q);
     return q;
 }
@@ -629,19 +630,19 @@ QSqlQuery QueryBuilder::findId(const QSharedPointer<Entity> &entity) const {
 QSqlQuery QueryBuilder::count(const QSharedPointer<Entity> &entity,
                               bool ignoreID) const {
     QHash<QString, QVariant> values = this->getEntityAttributes(
-                                          entity->getMetaProperties(),
-                                          entity);
+                EntityHelper::getMetaProperties(entity.data()),
+                entity);
     QSqlQuery q = this->database->getQuery(this->selectBase(QStringList(
-            entity->getTablename()),
-                                           QStringList(this->countFunction())) + this->where(
-                                                   values, "AND", ignoreID));
+                                                                entity->getTablename()),
+                                                            QStringList(this->countFunction())) + this->where(
+                                               values, "AND", ignoreID));
     this->bindValues(values, q, ignoreID);
     return q;
 }
 
 QSqlQuery QueryBuilder::count(const QString &tableName) const {
     QSqlQuery q = this->database->getQuery(this->selectBase(QStringList(
-            tableName), QStringList(this->countFunction())) + ";");
+                                                                tableName), QStringList(this->countFunction())) + ";");
     return q;
 }
 
@@ -652,7 +653,7 @@ const {
 
 
 QList<QSqlQuery> QueryBuilder::createOrMerge(const QSharedPointer<Entity>
-        &entity, bool insert) const {
+                                             &entity, bool insert) const {
     const QList<ClassAttributes> attrs = this->inheritedAttributes(entity);
     auto queries = QList<QSqlQuery>();
     bool first = true;
@@ -685,7 +686,7 @@ QSqlQuery QueryBuilder::insert(const QString &tableName,
     }
     QSqlQuery q = this->database->getQuery();
     QString p1 = "INSERT INTO " + this->schema->quoteTableName(
-                     tableName) + "(";
+                tableName) + "(";
     QString p2 = "VALUES(";
     if (!attributes.isEmpty()) {
         q.prepare(this->buildCreateQuery(attributes.constBegin(), attributes.constEnd(),
@@ -698,9 +699,9 @@ QSqlQuery QueryBuilder::insert(const QString &tableName,
 QSqlQuery QueryBuilder::update(const QString &tableName,
                                QHash<QString, QVariant> &attributes, const QString &primaryKey) const {
     QSqlQuery q = this->database->getQuery("UPDATE " + this->schema->quoteTableName(
-            tableName) + " SET " + this->attributes(attributes) + " WHERE " +
+                                               tableName) + " SET " + this->attributes(attributes) + " WHERE " +
                                            this->schema->quoteColumnName(primaryKey) + " = " + this->placeHolder(
-                                                   primaryKey) + ";");
+                                               primaryKey) + ";");
     this->bindValues(attributes, q);
     return q;
 }
@@ -723,7 +724,7 @@ QSqlQuery QueryBuilder::manyToMany(const QString &tableName,
     QString pk = "id";
     sql += " WHERE ";
     sql += this->schema->quoteColumnName(
-               attribute);
+                attribute);
     sql += " = " + this->placeHolder(pk) + ";";
     q.prepare(sql);
     this->bindValue(pk, id, q);
@@ -731,23 +732,23 @@ QSqlQuery QueryBuilder::manyToMany(const QString &tableName,
 }
 
 QSqlQuery QueryBuilder::manyToManyDelete(const QString &tableName,
-        const QString &attribute, const qint64 &id) {
+                                         const QString &attribute, const qint64 &id) {
     QSqlQuery q = this->database->getQuery();
     QString pkCol = "id";
     QString sql = "DELETE FROM " + this->schema->quoteTableName(
-                      tableName) + " WHERE " + this->schema->quoteColumnName(
-                      attribute) + "=" + this->placeHolder(pkCol);
+                tableName) + " WHERE " + this->schema->quoteColumnName(
+                attribute) + "=" + this->placeHolder(pkCol);
     q.prepare(sql);
     this->bindValue(pkCol, id, q);
     return q;
 }
 
 QSqlQuery QueryBuilder::manyToManyInsert(const QString &tableName,
-        const QString &col1, const QString &col2) const {
+                                         const QString &col1, const QString &col2) const {
     QSqlQuery q = this->database->getQuery();
     QString sql = "INSERT INTO " + this->schema->quoteTableName(
-                      tableName) + "(" + col1 + "," + col2 + ")"
-                  + "VALUES(?, ?);";
+                tableName) + "(" + col1 + "," + col2 + ")"
+            + "VALUES(?, ?);";
     q.prepare(sql);
     return q;
 }
@@ -759,7 +760,7 @@ const {
 
 QString QueryBuilder::joinSuperClasses(const QSharedPointer<Entity> &entity)
 const {
-    auto classes = entity->superClasses(true);
+    auto classes = EntityHelper::superClasses(entity.data(),true);
     QString joined = "";
     Entity *e = 0;
     for (int var = 0; var < classes.size(); ++var) {
@@ -778,7 +779,7 @@ const {
 
 QString QueryBuilder::countFunction(const QString &distinctColumn) const {
     return QString("COUNT(" + distinctColumn.isEmpty() ? "*" : (this->distinct() +
-                   this->schema->quoteColumnName(distinctColumn)) + ")");
+                                                                this->schema->quoteColumnName(distinctColumn)) + ")");
 }
 
 QString QueryBuilder::distinct() const {
@@ -801,7 +802,7 @@ QString QueryBuilder::limit(const qint64 &limit, const qint64 &offset) const {
 }
 
 QString QueryBuilder::generateManyToManyColumnName(const QSharedPointer<Entity>
-        &entity) const {
+                                                   &entity) const {
     if (entity) {
         return this->generateColumnNameID(entity->getTablename());
     }
@@ -815,10 +816,10 @@ QSqlQuery QueryBuilder::getQuery() const {
 
 
 QHash<QString, QVariant> QueryBuilder::saveAttributes(const
-        QSharedPointer<Entity> &entity, QHash<QString, QMetaProperty> props,
-        QHash<QString, Relation> relations) const {
+                                                      QSharedPointer<Entity> &entity, QHash<QString, QMetaProperty> props,
+                                                      QHash<QString, Relation> relations) const {
     if (props.isEmpty()) {
-        props = entity->getMetaProperties();
+        props = EntityHelper::getMetaProperties(entity.data());
     }
     auto values = this->getEntityAttributes(props, entity);
     auto relValues = this->getManyToOneAttributes(props, entity, relations);
@@ -831,9 +832,9 @@ QHash<QString, QVariant> QueryBuilder::saveAttributes(const
 }
 
 QHash<QString, QMetaProperty> QueryBuilder::processProperties(
-    const QSharedPointer<Entity> &e,
-    QHash<QString, QMetaProperty> &usedProperties) const {
-    auto properties = e->getMetaProperties();
+        const QSharedPointer<Entity> &e,
+        QHash<QString, QMetaProperty> &usedProperties) const {
+    auto properties = EntityHelper::getMetaProperties(e.data());
     QMutableHashIterator<QString, QMetaProperty> i(properties);
     while (i.hasNext()) {
         i.next();
@@ -848,8 +849,8 @@ QHash<QString, QMetaProperty> QueryBuilder::processProperties(
 }
 
 QHash<QString, Relation> QueryBuilder::processRelations(
-    const QSharedPointer<Entity> &e,
-    QHash<QString, Relation> &usedRelations) const {
+        const QSharedPointer<Entity> &e,
+        QHash<QString, Relation> &usedRelations) const {
     auto relations = e->getRelations();
     auto i = QMutableHashIterator<QString, Relation>(relations);
     while (i.hasNext()) {
@@ -864,12 +865,12 @@ QHash<QString, Relation> QueryBuilder::processRelations(
 }
 
 QList<QueryBuilder::ClassAttributes> QueryBuilder::inheritedAttributes(
-    const QSharedPointer<Entity> &entity) const {
+        const QSharedPointer<Entity> &entity) const {
     auto list = QList<QueryBuilder::ClassAttributes>();
     if (entity->getInheritanceStrategy() == InheritanceStrategy::JOINED_TABLE) {
         auto classes = QList<const QMetaObject *>();
         classes.append(entity->metaObject());
-        classes.append(entity->superClasses(true));
+        classes.append(EntityHelper::superClasses(entity.data(),true));
         auto usedProperties = QHash<QString, QMetaProperty>();
         auto usedRelations = QHash<QString, Relation>();
         QSharedPointer<Entity> e;
@@ -879,8 +880,8 @@ QList<QueryBuilder::ClassAttributes> QueryBuilder::inheritedAttributes(
                                            metaObj));
             if (e) {
                 list.append(QueryBuilder::ClassAttributes(e->getTablename(),
-                            this->saveAttributes(entity, this->processProperties(e, usedProperties),
-                                                 this->processRelations(e, usedRelations)), e->getPrimaryKey()));
+                                                          this->saveAttributes(entity, this->processProperties(e, usedProperties),
+                                                                               this->processRelations(e, usedRelations)), e->getPrimaryKey()));
             } else {
                 qDebug() << "Instance of " << metaObj->className() << " could not be created";
                 break;
@@ -888,7 +889,7 @@ QList<QueryBuilder::ClassAttributes> QueryBuilder::inheritedAttributes(
         }
     } else {
         list.append(QueryBuilder::ClassAttributes(entity->getTablename(),
-                    this->saveAttributes(entity), entity->getPrimaryKey()));
+                                                  this->saveAttributes(entity), entity->getPrimaryKey()));
     }
     return list;
 }
@@ -897,16 +898,16 @@ QString QueryBuilder::leftJoin(const QString &foreignTable,
                                const QString &tableName, const QString &foreignKey,
                                const QString &primaryKey) const {
     return "LEFT JOIN " + this->schema->quoteTableName(
-               foreignTable) + " ON " +
-           this->schema->quoteColumnName(foreignTable + "." + primaryKey) + "=" +
-           this->schema->quoteColumnName(
-               tableName + "." + foreignKey);
+                foreignTable) + " ON " +
+            this->schema->quoteColumnName(foreignTable + "." + primaryKey) + "=" +
+            this->schema->quoteColumnName(
+                tableName + "." + foreignKey);
 }
 
 QHash<QString, QVariant> QueryBuilder::getEntityAttributes(
-    const QHash<QString, QMetaProperty>
-    &props,
-    const QSharedPointer<Entity> &entity) const {
+        const QHash<QString, QMetaProperty>
+        &props,
+        const QSharedPointer<Entity> &entity) const {
     auto map = QHash<QString, QVariant>();
     auto transientAttrs = entity->getTransientAttributes();
     auto relations = entity->getRelations();
@@ -921,10 +922,10 @@ QHash<QString, QVariant> QueryBuilder::getEntityAttributes(
 }
 
 QHash<QString, QVariant> QueryBuilder::getManyToOneAttributes(
-    QHash<QString, QMetaProperty>
-    props,
-    const QSharedPointer<Entity> &entity,
-    QHash<QString, Relation> relations) const {
+        QHash<QString, QMetaProperty>
+        props,
+        const QSharedPointer<Entity> &entity,
+        QHash<QString, Relation> relations) const {
     auto map = QHash<QString, QVariant>();
     if (relations.isEmpty()) {
         relations = entity->getRelations();
@@ -991,8 +992,8 @@ QString QueryBuilder::placeHolder(const QString &key) const {
 QString QueryBuilder::where(const QSharedPointer<Entity> &entity,
                             QString conjunction,
                             bool ignoreID) const {
-    return this->where(this->getEntityAttributes(entity->getMetaProperties(),
-                       entity),
+    return this->where(this->getEntityAttributes(EntityHelper::getMetaProperties(entity.data()),
+                                                 entity),
                        conjunction, ignoreID, entity->getPrimaryKey());
 }
 
@@ -1033,7 +1034,7 @@ void QueryBuilder::setSchema(const QSharedPointer<Schema> &value) {
 }
 
 QueryBuilder::ClassAttributes::ClassAttributes(const QString name,
-        const QHash<QString, QVariant> attributes, QString pk) {
+                                               const QHash<QString, QVariant> attributes, QString pk) {
     this->name = name;
     this->attributes = attributes;
     this->pk = pk;
@@ -1052,7 +1053,7 @@ QHash<QString, QVariant> QueryBuilder::ClassAttributes::getAttributes() const {
 }
 
 void QueryBuilder::ClassAttributes::setAttributes(const QHash<QString, QVariant>
-        &value) {
+                                                  &value) {
     attributes = value;
 }
 
