commit 1a3b37ba4314001688f56e3c02870e75ea3ccbce
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Mon Jun 8 22:08:48 2015 +0200

    Inheritance gedöns

diff --git a/example/main.cpp b/example/main.cpp
index dbc25e7..465ec81 100644
--- a/example/main.cpp
+++ b/example/main.cpp
@@ -47,13 +47,13 @@ int main(int argc, char *argv[]) {
 
     Pupil *p = new Pupil();
     auto hash = p->getMetaProperties();
-    auto iterator = hash.constBegin();
-    while(iterator != hash.constEnd()) {
-        qDebug() << iterator.key() << " Value:" << iterator.value().read(p);
-
-        iterator++;
-    }
+//    auto iterator = hash.constBegin();
+//    while(iterator != hash.constEnd()) {
+//        qDebug() << iterator.key() << " Value:" << iterator.value().read(p);
 
+//        iterator++;
+//    }
+    qDebug() << p->metaObject()->superClass()->className();
 
     return 0;
 }
diff --git a/src/entity.cpp b/src/entity.cpp
index cefaed1..c12ac35 100644
--- a/src/entity.cpp
+++ b/src/entity.cpp
@@ -46,6 +46,10 @@ const QStringList Entity::getBLOBColumns() const {
     return QStringList();
 }
 
+const InheritanceStrategy Entity::getInheritanceStrategy() const {
+    return JOINED_TABLE;
+}
+
 QString Entity::getPrimaryKey() {
     return "id";
 }
diff --git a/src/entity.h b/src/entity.h
index d9665d3..db0cfd7 100644
--- a/src/entity.h
+++ b/src/entity.h
@@ -49,6 +49,7 @@ class Entity : public QObject {
     virtual const QHash<QString, Relation> getRelations() const;
     virtual const QStringList getTransientAttributes() const;
     virtual const QStringList getBLOBColumns() const;
+    virtual const InheritanceStrategy getInheritanceStrategy() const;
 
     //return value must be the exact name defined in Q_PROPERTY
     virtual QString getPrimaryKey();
diff --git a/src/querybuilder.cpp b/src/querybuilder.cpp
index 3520d76..52a0586 100644
--- a/src/querybuilder.cpp
+++ b/src/querybuilder.cpp
@@ -212,10 +212,14 @@ QHash<QString, QString> QueryBuilder::generateTableDefinition(
 const {
     auto map = QHash<QString, QString>();
     auto o = entity.data()->metaObject();
+    auto superMetaObject = entity.data()->metaObject()->superClass();
+    auto superMetaObjectPropertyMap = this->superMetaObjectPropMap(superMetaObject,
+                                      entity);
     QHash<QString, Relation> relations = entity.data()->getRelations();
     for (int var = 0; var < o->propertyCount(); ++var) {
         auto m = o->property(var);
-        if (m.name() != QString("objectName") && m.isReadable()
+        if (!superMetaObjectPropertyMap.contains(QString(m.name()))
+                && m.name() != QString("objectName") && m.isReadable()
                 && !entity.data()->getTransientAttributes().contains(m.name())) {
             if (m.isEnumType()) {
                 map.insert(m.name(), this->schema.data()->getTypeMap().data()->value(
@@ -238,10 +242,13 @@ const {
         }
     }
     QString pkType = map.value(entity.data()->getPrimaryKey());
-    if (pkType == this->schema.data()->TYPE_BIGINT) {
-        map.insert(entity.data()->getPrimaryKey(), this->schema.data()->TYPE_BIGPK);
-    } else {
-        map.insert(entity.data()->getPrimaryKey(), this->schema.data()->TYPE_PK);
+    if (entity.data()->getInheritanceStrategy() != JOINED_TABLE
+            || QString(superMetaObject->className()) == QString("Entity")) {
+        if (pkType == this->schema.data()->TYPE_BIGINT) {
+            map.insert(entity.data()->getPrimaryKey(), this->schema.data()->TYPE_BIGPK);
+        } else {
+            map.insert(entity.data()->getPrimaryKey(), this->schema.data()->TYPE_PK);
+        }
     }
     return map;
 }
@@ -512,6 +519,26 @@ QString QueryBuilder::leftJoin(const QString &foreignTable,
                tableName + "." + foreignKey);
 }
 
+QHash<QString, QMetaProperty> QueryBuilder::superMetaObjectPropMap(
+    const QMetaObject *&superMeta, const QSharedPointer<Entity> &entity) const {
+    auto superMetaObjectPropertyMap = QHash<QString, QMetaProperty>();
+    if (QString(superMeta->className()) != QString("Entity")
+            && entity.data()->getInheritanceStrategy() == 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;
+}
+
+QString QueryBuilder::superClassColumnName(const QMetaObject *&superMeta)
+const {
+    return QString(superMeta->className()).toLower();
+}
+
 QString QueryBuilder::limit(const qint64 &limit, const qint64 &offset) const {
     QString s = "";
     if (limit > 0) {
@@ -573,7 +600,7 @@ QHash<QString, QVariant> QueryBuilder::getManyToOneAttributes(
     auto i = relations.constBegin();
     while (i != relations.constEnd()) {
         Relation r = i.value();
-        if (r.getType() == MANY_TO_ONE && props.contains(i.key())
+        if ((r.getType() == MANY_TO_ONE && props.contains(i.key()))
                 || (r.getType() == ONE_TO_ONE && r.getMappedBy().isEmpty())) {
             auto v = props.value(i.key()).read(e);
             if (v.canConvert<Entity *>()) {
diff --git a/src/querybuilder.h b/src/querybuilder.h
index 99f9aee..650c748 100644
--- a/src/querybuilder.h
+++ b/src/querybuilder.h
@@ -141,6 +141,9 @@ class QueryBuilder {
     const;
     QString leftJoin(const QString &foreignTable, const QString &tableName,
                      const QString &foreignKey);
+    QHash<QString, QMetaProperty> superMetaObjectPropMap(const QMetaObject
+            * &superMeta, const QSharedPointer<Entity> &entity) const;
+    QString superClassColumnName(const QMetaObject *&superMeta) const;
 
     QSharedPointer<Schema> schema;
     QSharedPointer<Database> database;
diff --git a/src/relation.h b/src/relation.h
index 0a703ec..19c6d7f 100644
--- a/src/relation.h
+++ b/src/relation.h
@@ -25,6 +25,11 @@ enum RelationType {
     MANY_TO_MANY,
 };
 
+enum InheritanceStrategy {
+    PER_CLASS_TABLE,
+    JOINED_TABLE,
+};
+
 enum CascadeType {
     ALL,
     MERGE,
