[hibernate-commits] Hibernate SVN: r20975 - annotations/branches/v3_4_0_GA_CP/src/main/java/org/hibernate/cfg.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Aug 29 17:41:33 EDT 2011


Author: alessandrolt
Date: 2011-08-29 17:41:33 -0400 (Mon, 29 Aug 2011)
New Revision: 20975

Modified:
   annotations/branches/v3_4_0_GA_CP/src/main/java/org/hibernate/cfg/AnnotationBinder.java
Log:
JBPAPP-6311 Filters defined in superclass are not inherited in subclasses - added org.hibernate.test.annotations.filters.InheritedFilterTest.java as well

Modified: annotations/branches/v3_4_0_GA_CP/src/main/java/org/hibernate/cfg/AnnotationBinder.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/main/java/org/hibernate/cfg/AnnotationBinder.java	2011-08-23 01:52:45 UTC (rev 20974)
+++ annotations/branches/v3_4_0_GA_CP/src/main/java/org/hibernate/cfg/AnnotationBinder.java	2011-08-29 21:41:33 UTC (rev 20975)
@@ -398,6 +398,13 @@
 		//TODO: be more strict with secondarytable allowance (not for ids, not for secondary table join columns etc)
 		InheritanceState inheritanceState = inheritanceStatePerClass.get( clazzToProcess );
 		AnnotatedClassType classType = mappings.getClassType( clazzToProcess );
+		
+		if ( AnnotatedClassType.EMBEDDABLE_SUPERCLASS.equals( classType ) ) {
+			bindQueries( clazzToProcess, mappings );
+			bindTypeDefs( clazzToProcess, mappings );
+			bindFilterDefs( clazzToProcess, mappings );
+		}		
+		
 		if ( AnnotatedClassType.EMBEDDABLE_SUPERCLASS.equals( classType ) //will be processed by their subentities
 				|| AnnotatedClassType.NONE.equals( classType ) //to be ignored
 				|| AnnotatedClassType.EMBEDDABLE.equals( classType ) //allow embeddable element declaration
@@ -555,16 +562,12 @@
 		entityBinder.setWhere( whereAnn );
 		entityBinder.setCache( cacheAnn );
 		entityBinder.setInheritanceState( inheritanceState );
-		Filter filterAnn = annotatedClass.getAnnotation( Filter.class );
-		if ( filterAnn != null ) {
-			entityBinder.addFilter( filterAnn.name(), filterAnn.condition() );
-		}
-		Filters filtersAnn = annotatedClass.getAnnotation( Filters.class );
-		if ( filtersAnn != null ) {
-			for (Filter filter : filtersAnn.value()) {
-				entityBinder.addFilter( filter.name(), filter.condition() );
-			}
-		}
+
+		 //Filters are not allowed on subclasses
+		if ( !inheritanceState.hasParents) {
+		   bindFilters( clazzToProcess, entityBinder, mappings );
+		}		
+					
 		entityBinder.bindEntity();
 
 		if ( inheritanceState.hasTable() ) {
@@ -925,7 +928,44 @@
 
 		return classesToProcess;
 	}
+	
+	/*
+	 * Process the filters defined on the given class, as well as all filters defined
+	 * on the MappedSuperclass(s) in the inheritance hierarchy
+	 */
 
+	private static void bindFilters(XClass annotatedClass, EntityBinder entityBinder,
+									Mappings mappings) {
+
+		bindFilters( annotatedClass, entityBinder );
+
+		XClass classToProcess = annotatedClass.getSuperclass();
+		while ( classToProcess != null ) {
+			if(mappings instanceof ExtendedMappings){
+			AnnotatedClassType classType = ((ExtendedMappings)mappings).getClassType( classToProcess );
+				if ( AnnotatedClassType.EMBEDDABLE_SUPERCLASS.equals( classType ) ) {
+					bindFilters( classToProcess, entityBinder );
+				}
+			}
+			classToProcess = classToProcess.getSuperclass();
+		}
+	}
+
+	private static void bindFilters(XAnnotatedElement annotatedElement, EntityBinder entityBinder) {
+
+		Filters filtersAnn = annotatedElement.getAnnotation( Filters.class );
+		if ( filtersAnn != null ) {
+			for ( Filter filter : filtersAnn.value() ) {
+				entityBinder.addFilter( filter.name(), filter.condition() );
+			}
+		}
+
+		Filter filterAnn = annotatedElement.getAnnotation( Filter.class );
+		if ( filterAnn != null ) {
+			entityBinder.addFilter( filterAnn.name(), filterAnn.condition() );
+		}
+	}
+	
 	private static void bindFilterDefs(XAnnotatedElement annotatedElement, ExtendedMappings mappings) {
 		FilterDef defAnn = annotatedElement.getAnnotation( FilterDef.class );
 		FilterDefs defsAnn = annotatedElement.getAnnotation( FilterDefs.class );



More information about the hibernate-commits mailing list