commit d77273190ae012cd8ad5a0cb3d03b25c69cf422b
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Thu Jul 16 23:33:16 2015 +0200

    update

diff --git a/EntityManager.pro b/EntityManager.pro
index de72c87..43744c0 100644
--- a/EntityManager.pro
+++ b/EntityManager.pro
@@ -1,9 +1,3 @@
-#-------------------------------------------------
-#
-# Project created by QtCreator 2013-08-01T15:03:24
-#
-#-------------------------------------------------
-
 QT       += core
 QT       += sql
 QT       -= gui
diff --git a/samples/example/Example.pro b/samples/example/Example.pro
index d656cb6..a9d4a7f 100644
--- a/samples/example/Example.pro
+++ b/samples/example/Example.pro
@@ -1,12 +1,5 @@
-#-------------------------------------------------
-#
-# Project created by QtCreator 2013-08-01T15:03:24
-#
-#-------------------------------------------------
-
 QT       += core
 QT       += sql
-
 QT       -= gui
 
 #TARGET = EntityManager
diff --git a/samples/example/main.cpp b/samples/example/main.cpp
index a2b4527..1c1ef2f 100644
--- a/samples/example/main.cpp
+++ b/samples/example/main.cpp
@@ -24,6 +24,7 @@ int main(int argc, char *argv[]) {
     CuteEntityManager::EntityManager *e = new
     CuteEntityManager::EntityManager("QSQLITE",
                                      QDir::currentPath() + "/db.sqlite");
+    Enums::ContactCategory::EMAIL_CONTACT;
     EntityInstanceFactory::registerClass<Group>();
     EntityInstanceFactory::registerClass<Person>();
     EntityInstanceFactory::registerClass<Pupil>();
diff --git a/samples/example/models/enums.h b/samples/example/models/enums.h
index 363483a..bbb6b8c 100644
--- a/samples/example/models/enums.h
+++ b/samples/example/models/enums.h
@@ -4,7 +4,7 @@
 struct Enums {
     Q_GADGET
   public:
-    enum class ContactCategory {EMAIL_CONTACT, MOBILE_CONTACT, LANDLINE_CONTACT, MESSENGER_CONTACT, EXTRA1_CONTACT, EXTRA2_CONTACT, EXTRA3_CONTACT, EXTRA4_CONTACT, EXTRA5_CONTACT, EXTRA6_CONTACT} ;
+    enum ContactCategory {EMAIL_CONTACT, MOBILE_CONTACT, LANDLINE_CONTACT, MESSENGER_CONTACT, EXTRA1_CONTACT, EXTRA2_CONTACT, EXTRA3_CONTACT, EXTRA4_CONTACT, EXTRA5_CONTACT, EXTRA6_CONTACT} ;
     Q_ENUM(ContactCategory)
     enum class Orientation {LANDSCAPE_ORIENTATION, PORTRAIT_ORIENTATION, LANDSCAPE_180_ORIENTATION, PORTRAIT_180_ORIENTATION};
     Q_ENUM(Orientation)
diff --git a/src/entityinstancefactory.cpp b/src/entityinstancefactory.cpp
index 3d76a17..a2d3050 100644
--- a/src/entityinstancefactory.cpp
+++ b/src/entityinstancefactory.cpp
@@ -112,3 +112,13 @@ Entity *EntityInstanceFactory::newSuperClassInstance(const Entity *e) {
 Entity *EntityInstanceFactory::createInstance(const QMetaObject *object) {
     return qobject_cast<Entity *>(object->newInstance());
 }
+
+QList<QSharedPointer<Entity> > EntityInstanceFactory::castQVariantList(
+    QVariant &list) {
+    return *reinterpret_cast<QList<QSharedPointer<Entity>>*>(list.data());
+}
+
+QSharedPointer<Entity> EntityInstanceFactory::castQVariant(
+    QVariant &entity) {
+    return *reinterpret_cast<QSharedPointer<Entity>*>(entity.data());
+}
diff --git a/src/entityinstancefactory.h b/src/entityinstancefactory.h
index e8676fc..411a6ac 100644
--- a/src/entityinstancefactory.h
+++ b/src/entityinstancefactory.h
@@ -36,6 +36,8 @@ class EntityInstanceFactory {
     static const QString extractEntityType(const QString &s);
     static Entity *newSuperClassInstance(const Entity *e);
     static Entity *createInstance(const QMetaObject *object);
+    static QList<QSharedPointer<Entity>> castQVariantList(QVariant &list);
+    static QSharedPointer<Entity> castQVariant(QVariant &entity);
 
     template<typename T>
     static Entity *createInstance() {
diff --git a/src/entitymanager.cpp b/src/entitymanager.cpp
index e9dee06..075cef8 100644
--- a/src/entitymanager.cpp
+++ b/src/entitymanager.cpp
@@ -262,12 +262,11 @@ void EntityManager::setListProperty(const QSharedPointer<Entity> &entity,
 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<QSharedPointer<Entity>>>()) {
-        QList<QSharedPointer<Entity>> list = var.value<QList<QSharedPointer<Entity>>>();
+    if (!var.isNull() && var.canConvert<QList<QVariant>>()) {
+        auto list = EntityInstanceFactory::castQVariantList(var);
         if (!list.contains(add)) {
             list.append(add);
-            var.setValue<QList<QSharedPointer<Entity>>>(list);
-            property.write(entity.data(), var);
+             this->setListProperty(entity,list,property);
         }
     }
 }
@@ -327,21 +326,10 @@ void EntityManager::persistMappedByRelation(const QList<QSharedPointer<Entity> >
                                   builder->generateManyToManyColumnName(entity),
                                   builder->generateManyToManyColumnName(ptr));
     q.bindValue(0, entity->getId());
-    QMetaProperty prop;
-    bool first = true;
+    auto prop = this->mappedProperty(r,ptr);
     QSharedPointer<Entity> item;
     for (int var = 0; var < saved.size(); ++var) {
         item = list.at(var);
-        if (first && !r.getMappedBy().isEmpty()) {
-            auto props = ptr->getMetaProperties();
-            if (props.contains(r.getMappedBy())) {
-                prop = props.value(r.getMappedBy());
-            }
-        }
-        qDebug() << "Property valid:" << prop.isValid();
-        /**
-          @todo wip
-          **/
         if (ptr->property(ptr->getPrimaryKey()).toLongLong() > -1) {
             q.bindValue(1, ptr->property(ptr->getPrimaryKey()));
             q.exec();
@@ -358,6 +346,29 @@ 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()) {
+        if (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(ALL)
@@ -425,6 +436,7 @@ void EntityManager::setNullEntityPropertyRelation(QVariant &var,
     }
 }
 
+
 void EntityManager::removeEntity(QVariant &var) {
     if (!var.isNull() && var.canConvert<QSharedPointer<Entity>>()) {
         auto e = qvariant_cast<QSharedPointer<Entity>>(var);
@@ -498,8 +510,8 @@ void EntityManager::persistManyToMany(const QSharedPointer<Entity> &entity,
     auto list = property.value<QList<QVariant>>();
     if (!list.isEmpty()) {
         if (!list.at(0).isNull()) {
-            QVariant var = list.at(0);
-            auto ptr = *reinterpret_cast<QSharedPointer<Entity>*>(var.data());
+            auto var = list.at(0);
+            auto ptr = EntityInstanceFactory::castQVariant(var);
             auto builder = this->schema->getQueryBuilder();
             QString tblName = builder->generateManyToManyTableName(entity, ptr);
             if (this->schema->getTables().contains(tblName)) {
@@ -507,7 +519,7 @@ void EntityManager::persistManyToMany(const QSharedPointer<Entity> &entity,
                                   tblName, builder->generateManyToManyColumnName(entity),
                                   entity->property(entity->getPrimaryKey()).toLongLong());
                 if (this->db->transaction(q)) {
-                    auto nList = *reinterpret_cast<QList<QSharedPointer<Entity>>*>(property.data());
+                    auto nList = EntityInstanceFactory::castQVariantList(property);
                     this->persistMappedByRelation(nList, q, entity, ptr, r, tblName);
                 }
             } else {
diff --git a/src/entitymanager.h b/src/entitymanager.h
index 59a1d60..4b04aa3 100644
--- a/src/entitymanager.h
+++ b/src/entitymanager.h
@@ -103,6 +103,7 @@ 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;
 
   public:
     EntityManager(QSqlDatabase database);
