diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php
index 8bfda64..476fbb8 100644
--- a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php
+++ b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php
@@ -229,6 +229,27 @@ class ClassMetadataFactory implements ClassMetadataFactoryInterface
     }
 
     /**
+     * Does the given entity class have an inherited identifier?
+     *
+     * @param string $name
+     * @return true or false
+     */
+    protected function hasInheritedIdentifier($name)
+    {
+        // Collect parent classes, ignoring transient (not-mapped) classes
+        // to see if they have an identifier
+        foreach (array_reverse(class_parents($name)) as $parentClass) {
+            if ( ! $this->driver->isTransient($parentClass)) {
+                $parent = $this->loadedMetadata[$parentClass];
+                if (!$parent->isInheritanceTypeNone() && $parent->identifier) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
      * Loads the metadata of the class in question and all it's ancestors whose metadata
      * is still not loaded.
      *
@@ -314,7 +335,7 @@ class ClassMetadataFactory implements ClassMetadataFactoryInterface
             }
 
             // Verify & complete identifier mapping
-            if ( ! $class->identifier && ! $class->isMappedSuperclass) {
+            if ( ! $class->identifier && ! $class->isMappedSuperclass && ! $this->hasInheritedIdentifier($name)) {
                 throw MappingException::identifierRequired($className);
             }
 
