Merge branch '92'
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java b/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java
index 0eddd05..500ee03 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java
@@ -44,6 +44,7 @@
 import java.util.Map;
 import java.util.SortedMap;
 import java.util.TreeMap;
+import java.util.HashMap;
 
 import static java.util.Collections.emptyList;
 
@@ -1400,6 +1401,16 @@
         return getNameWithPackage(defaultClientPackage, name);
     }
 
+    public Map<String, ObjEntity> getSubclassesForObjEntity(ObjEntity superEntity) {
+        Map<String, ObjEntity> subObjectEntities = new HashMap(5);
+        for (ObjEntity objectEntity : objEntityMap.values()) {
+            if (superEntity.getName().equals(objectEntity.getSuperEntityName())) {
+                subObjectEntities.put(objectEntity.getName(), objectEntity);
+            }
+        }
+        return subObjectEntities;
+    }
+
     public ReverseEngineering getReverseEngineering() {
         return reverseEngineering;
     }
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java b/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java
index 7d38cd8..5bcccce 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java
@@ -180,29 +180,59 @@
                     createObjRelationship(entity, dr, mappedTarget.getName());
                 }
             } else {
-                LOG.warn("Can't find ObjEntity for " + dr.getTargetEntityName());
-                LOG.warn("Db Relationship (" + dr + ") will have GUESSED Obj Relationship reflection. ");
-
                 if (targetEntity == null) {
                     targetEntity = new DbEntity(dr.getTargetEntityName());
                 }
-                createObjRelationship(entity, dr, nameGenerator.createObjEntityName(targetEntity));
+                if (dr.getTargetEntityName() != null) {
+                    boolean needGeneratedEntity = createObjRelationship(entity, dr, nameGenerator.createObjEntityName(targetEntity));
+                    if (needGeneratedEntity) {
+                        LOG.warn("Can't find ObjEntity for " + dr.getTargetEntityName());
+                        LOG.warn("Db Relationship (" + dr + ") will have GUESSED Obj Relationship reflection. ");
+                    }
+                }
             }
         }
         return true;
     }
 
-    private void createObjRelationship(ObjEntity entity, DbRelationship dr, String targetEntityName) {
+    private boolean createObjRelationship(ObjEntity entity, DbRelationship dr, String targetEntityName) {
         String relationshipName = nameGenerator.createObjRelationshipName(dr);
         relationshipName = DefaultUniqueNameGenerator.generate(NameCheckers.objRelationship, entity, relationshipName);
 
         ObjRelationship or = new ObjRelationship(relationshipName);
         or.addDbRelationship(dr);
-        or.setSourceEntity(entity);
-        or.setTargetEntityName(targetEntityName);
-        entity.addRelationship(or);
+        Map<String, ObjEntity> objEntities = entity.getDataMap().getSubclassesForObjEntity(entity);
 
-        fireRelationshipAdded(or);
+        boolean hasFlattingAttributes = false;
+        boolean needGeneratedEntity = true;
+
+        if (objEntities.containsKey(targetEntityName)) {
+            needGeneratedEntity = false;
+        }
+
+        for (ObjEntity subObjEntity : objEntities.values()) {
+            for (ObjAttribute objAttribute : subObjEntity.getAttributes()) {
+                String path = objAttribute.getDbAttributePath();
+                if (path != null) {
+                    if (path.startsWith(or.getDbRelationshipPath())) {
+                        hasFlattingAttributes = true;
+                        break;
+                    }
+                }
+            }
+        }
+
+        if (!hasFlattingAttributes) {
+            if (needGeneratedEntity) {
+                or.setTargetEntityName(targetEntityName);
+                or.setSourceEntity(entity);
+            }
+
+            entity.addRelationship(or);
+            fireRelationshipAdded(or);
+        }
+
+        return needGeneratedEntity;
     }
 
     private boolean addMissingAttributes(ObjEntity entity) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeRelationshipTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeRelationshipTab.java
index fcdf45d..9406cf8 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeRelationshipTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeRelationshipTab.java
@@ -61,6 +61,7 @@
     private CutAttributeRelationshipAction cut;
     private RemoveAttributeRelationshipAction remove;
     private CopyAttributeRelationshipAction copy;
+    private JToolBar toolBar;
 
     public ObjEntityAttributeRelationshipTab(ProjectController mediator) {
         this.mediator = mediator;
@@ -95,7 +96,7 @@
     }
 
     private void initToolBar() {
-        JToolBar toolBar = new JToolBar();
+        toolBar = new JToolBar();
         ActionManager actionManager = Application.getInstance().getActionManager();
 
         toolBar.add(actionManager.getAction(CreateAttributeAction.class).buildButton());
@@ -167,4 +168,8 @@
         attributePanel.currentObjEntityChanged(e);
         relationshipPanel.currentObjEntityChanged(e);
     }
-}
\ No newline at end of file
+
+    public JToolBar getToolBar() {
+        return toolBar;
+    }
+}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityRelationshipPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityRelationshipPanel.java
index a9900c4..7a4c2af 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityRelationshipPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityRelationshipPanel.java
@@ -225,6 +225,13 @@
         if (e.isUnselectAttributes()) {
             table.clearSelection();
         }
+
+        ObjEntity objEntity = (ObjEntity) e.getEntity();
+        if (objEntity.getSuperEntity() != null) {
+            parentPanel.getToolBar().getComponentAtIndex(2).setEnabled(false);
+        } else {
+            parentPanel.getToolBar().getComponentAtIndex(2).setEnabled(true);
+        }
     }
 
     /**