Author: awhite
Date: Wed Nov 15 09:43:02 2006
New Revision: 475321

URL: http://svn.apache.org/viewvc?view=rev&rev=475321
Log:
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).


Modified:
    
incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java

Modified: 
incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java
URL: 
http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java?view=diff&rev=475321&r1=475320&r2=475321
==============================================================================
--- 
incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java
 (original)
+++ 
incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java
 Wed Nov 15 09:43:02 2006
@@ -413,8 +413,6 @@
      */
     protected ClassStrategy namedStrategy(ClassMapping cls) {
         String name = cls.getMappingInfo().getStrategy();
-        if (name == null)
-            return null;
         return instantiateClassStrategy(name, cls);
     }
 
@@ -423,6 +421,8 @@
      */
     protected ClassStrategy instantiateClassStrategy(String name,
         ClassMapping cls) {
+        if (name == null)
+            return null;
         if (NoneClassStrategy.ALIAS.equals(name))
             return NoneClassStrategy.getInstance();
 
@@ -650,17 +650,27 @@
             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();
     }
 


Reply via email to