From 728413153f275ae045275e04ca32fc2432bce149 Mon Sep 17 00:00:00 2001
From: "A. Abram White" <awhite@apache.org>
Date: Wed, 15 Nov 2006 17:43:02 +0000
Subject: [PATCH] Fix bug in which abstract JPA entities were being mapped to
 tables when the declared inheritance strategy for the hierarchy was
 TABLE_PER_CLASS (which actually means table-per-concrete-class).

git-svn-id: https://svn.apache.org/repos/asf/incubator/openjpa/trunk@475321 13f79535-47bb-0310-9956-ffa450edef68
---
 .../openjpa/jdbc/meta/MappingRepository.java  | 28 +++++++++++++------
 1 file changed, 19 insertions(+), 9 deletions(-)

diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java
index ecb50a28b..cc7285085 100644
--- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java
+++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java
@@ -413,8 +413,6 @@ public class MappingRepository
      */
     protected ClassStrategy namedStrategy(ClassMapping cls) {
         String name = cls.getMappingInfo().getStrategy();
-        if (name == null)
-            return null;
         return instantiateClassStrategy(name, cls);
     }
 
@@ -423,6 +421,8 @@ public class MappingRepository
      */
     protected ClassStrategy instantiateClassStrategy(String name,
         ClassMapping cls) {
+        if (name == null)
+            return null;
         if (NoneClassStrategy.ALIAS.equals(name))
             return NoneClassStrategy.getInstance();
 
@@ -650,17 +650,27 @@ public class MappingRepository
             return instantiateClassStrategy((String) strat, cls);
         if (strat != null)
             return (ClassStrategy) strat;
+        
+        // see if there is a declared hierarchy strategy
+        ClassStrategy hstrat = null;
+        for (ClassMapping base = cls; base != null && hstrat == null;) {
+            hstrat = instantiateClassStrategy(base.getMappingInfo().
+                getHierarchyStrategy(), cls);
+            base = base.getMappedPCSuperclassMapping();
+        }
 
+        // the full strategy as applied to a hierarchy is a
+        // table-per-concrete-class strategy, so don't map abstract types
+        if (hstrat instanceof FullClassStrategy
+            && !cls.isManagedInterface()
+            && Modifier.isAbstract(cls.getDescribedType().getModifiers()))
+            return NoneClassStrategy.getInstance();
+        
         ClassMapping sup = cls.getMappedPCSuperclassMapping();
         if (sup == null)
             return new FullClassStrategy();
-
-        while (sup.getMappedPCSuperclassMapping() != null)
-            sup = sup.getMappedPCSuperclassMapping();
-        String subStrat = sup.getMappingInfo().getHierarchyStrategy();
-        if (subStrat != null)
-            return instantiateClassStrategy(subStrat, cls);
-
+        if (hstrat != null)
+            return hstrat;
         return new FlatClassStrategy();
     }