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(); }