commit 09b2592d9638db1fdc29d479c3354d59c753f4fd
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Sat Jul 25 14:26:04 2015 +0200

    ticket #572

diff --git a/src/entitymanager.cpp b/src/entitymanager.cpp
index 5e09bde..f93488c 100644
--- a/src/entitymanager.cpp
+++ b/src/entitymanager.cpp
@@ -486,7 +486,7 @@ void EntityManager::removeManyToManyEntityList(const QSharedPointer<Entity> &e,
         if (!list.isEmpty()) {
             auto builder = this->schema->getQueryBuilder();
             auto ptr = list.at(0);
-            QString tblName = builder->generateManyToManyTableName(e, ptr);
+            QString tblName = builder->generateManyToManyTableName(e, ptr, r);
             if (this->schema->getTables().contains(tblName)) {
                 QSqlQuery q = builder->manyToManyDelete(
                                   tblName, builder->generateManyToManyColumnName(e),
@@ -528,13 +528,12 @@ const QList<QSharedPointer<Entity> > &list, const Relation &r) {
 
 void EntityManager::persistManyToMany(const QSharedPointer<Entity> &entity,
                                       const Relation &r, QVariant &property) {
-    Q_UNUSED(r)
     auto list = property.value<QList<QVariant>>();
     if (!list.isEmpty() && !(list.at(0).isNull())) {
         auto var = list.at(0);
         auto ptr = EntityInstanceFactory::castQVariant(var);
         auto builder = this->schema->getQueryBuilder();
-        QString tblName = builder->generateManyToManyTableName(entity, ptr);
+        QString tblName = builder->generateManyToManyTableName(entity, ptr, r);
         if (this->schema->getTables().contains(tblName)) {
             QSqlQuery q = builder->manyToManyDelete(
                               tblName, builder->generateManyToManyColumnName(entity),
@@ -552,13 +551,14 @@ void EntityManager::persistManyToMany(const QSharedPointer<Entity> &entity,
 
 
 void EntityManager::manyToMany(const QSharedPointer<Entity> &entity,
-                               const QMetaProperty &property, const bool refresh) {
+                               const QMetaProperty &property, const Relation &relation, const bool refresh) {
     QSharedPointer<Entity> secEntityPtr = QSharedPointer<Entity>
                                           (EntityInstanceFactory::createInstance(EntityInstanceFactory::extractEntityType(
                                                   QString(property.typeName()))));
     auto builder = this->schema->getQueryBuilder();
     if (secEntityPtr) {
-        QString tblName = builder->generateManyToManyTableName(entity, secEntityPtr);
+        QString tblName = builder->generateManyToManyTableName(entity, secEntityPtr,
+                          relation);
         if (this->schema->getTables().contains(tblName)) {
             QSqlQuery q = builder->manyToMany(tblName,
                                               builder->generateManyToManyColumnName(entity),
@@ -750,7 +750,7 @@ void EntityManager::resolveRelations(const QSharedPointer<Entity> &entity,
             }
             break;
         case RelationType::MANY_TO_MANY:
-            this->manyToMany(entity, property, refresh);
+            this->manyToMany(entity, property, r, refresh);
             break;
         case RelationType::ONE_TO_MANY:
             this->oneToMany(entity, r, property, refresh);
diff --git a/src/entitymanager.h b/src/entitymanager.h
index ade7c6d..7522cb3 100644
--- a/src/entitymanager.h
+++ b/src/entitymanager.h
@@ -181,7 +181,7 @@ class EntityManager : public QObject {
     void oneToMany(const QSharedPointer<Entity> &entity, const Relation &r,
                    const QMetaProperty &property, const bool refresh = false);
     void manyToMany(const QSharedPointer<Entity> &entity,
-                    const QMetaProperty &property, const bool refresh = false);
+                    const QMetaProperty &property, const Relation &relation, const bool refresh = false);
     void oneToOne(const QSharedPointer<Entity> &entity, const Relation &r,
                   const QMetaProperty &property, const bool refresh = false,
                   const QVariant &id = "");
diff --git a/src/querybuilder.cpp b/src/querybuilder.cpp
index 0259690..58baf6c 100644
--- a/src/querybuilder.cpp
+++ b/src/querybuilder.cpp
@@ -126,7 +126,7 @@ void QueryBuilder::createRelationFK(QStringList &queries,
                                                QStringList(ptr->getPrimaryKey()), remove, update));
 
         } else if (relation.getType() == RelationType::MANY_TO_MANY) {
-            QString tableName = this->generateManyToManyTableName(entity, ptr);
+            QString tableName = this->generateManyToManyTableName(entity, ptr,relation);
             queries.append(this->createForeignKeyManyToMany(tableName, entity, update,
                            remove));
             queries.append(this->createForeignKeyManyToMany(tableName, ptr, update,
@@ -409,15 +409,11 @@ const {
 
 QString QueryBuilder::generateManyToManyTableName(const QSharedPointer<Entity>
         &firstEntity,
-        const QSharedPointer<Entity> &secondEntity) const {
-    QString first = QString(firstEntity->getClassname());
-    QString second = QString(secondEntity->getClassname());
-    if (QString::compare(first, second, Qt::CaseSensitive) <= 0) {
-        return firstEntity->getTablename() + "_" +
-               secondEntity->getTablename();
+        const QSharedPointer<Entity> &secondEntity, const Relation &r) const {
+    if (r.getMappedBy().isEmpty()) {
+        return firstEntity->getTablename() + "_" + r.getPropertyName();
     } else {
-        return secondEntity->getTablename() + "_" +
-               firstEntity->getTablename();
+        return secondEntity->getTablename() + "_" + r.getMappedBy();
     }
 }
 
@@ -440,7 +436,7 @@ const {
                                                  QMetaType::typeName(meta.userType()))));
             h.insert(this->generateManyToManyColumnName(ptr),
                      this->schema->TYPE_BIGINT);
-            relations.insert(this->generateManyToManyTableName(entity, ptr), h);
+            relations.insert(this->generateManyToManyTableName(entity, ptr, r), h);
         }
     }
     return relations;
diff --git a/src/querybuilder.h b/src/querybuilder.h
index 510f063..dd0baa7 100644
--- a/src/querybuilder.h
+++ b/src/querybuilder.h
@@ -97,7 +97,7 @@ class QueryBuilder {
             &entity)
     const;
     QString generateManyToManyTableName(const QSharedPointer<Entity> &firstEntity,
-                                        const QSharedPointer<Entity> &secondEntity) const;
+                                        const QSharedPointer<Entity> &secondEntity, const Relation &r) const;
 
     QString transformTypeToAbstractDbType(QString typeName) const;
     QString transformAbstractTypeToRealDbType(QString typeName) const;
