HHH-10076 - bytecode enhancer - CompositeEnhancer does not add ManagedComposite marker interface

(cherry picked from commit 4d6eca5ff8)
This commit is contained in:
barreiro 2015-08-13 04:55:26 +01:00 committed by Steve Ebersole
parent ae6d84b974
commit e3c6c02178
3 changed files with 10 additions and 23 deletions

View File

@ -28,6 +28,9 @@ public class CompositeEnhancer extends Enhancer {
} }
public void enhance(CtClass managedCtClass) { public void enhance(CtClass managedCtClass) {
// add the ManagedComposite interface
managedCtClass.addInterface( managedCompositeCtClass );
addInterceptorHandling( managedCtClass ); addInterceptorHandling( managedCtClass );
if ( enhancementContext.doDirtyCheckingInline( managedCtClass ) ) { if ( enhancementContext.doDirtyCheckingInline( managedCtClass ) ) {

View File

@ -42,6 +42,7 @@ public class Enhancer {
protected final ClassPool classPool; protected final ClassPool classPool;
protected final CtClass managedEntityCtClass; protected final CtClass managedEntityCtClass;
protected final CtClass managedCompositeCtClass;
protected final CtClass attributeInterceptorCtClass; protected final CtClass attributeInterceptorCtClass;
protected final CtClass attributeInterceptableCtClass; protected final CtClass attributeInterceptableCtClass;
protected final CtClass entityEntryCtClass; protected final CtClass entityEntryCtClass;
@ -57,16 +58,11 @@ public class Enhancer {
this.enhancementContext = enhancementContext; this.enhancementContext = enhancementContext;
this.classPool = buildClassPool( enhancementContext ); this.classPool = buildClassPool( enhancementContext );
// add ManagedEntity contract // pre-load some of the interfaces that are used
this.managedEntityCtClass = loadCtClassFromClass( classPool, ManagedEntity.class ); this.managedEntityCtClass = loadCtClassFromClass( classPool, ManagedEntity.class );
this.managedCompositeCtClass = loadCtClassFromClass( classPool, ManagedComposite.class );
// add PersistentAttributeInterceptable contract
this.attributeInterceptableCtClass = loadCtClassFromClass( classPool, PersistentAttributeInterceptable.class ); this.attributeInterceptableCtClass = loadCtClassFromClass( classPool, PersistentAttributeInterceptable.class );
// add PersistentAttributeInterceptor contract
this.attributeInterceptorCtClass = loadCtClassFromClass( classPool, PersistentAttributeInterceptor.class ); this.attributeInterceptorCtClass = loadCtClassFromClass( classPool, PersistentAttributeInterceptor.class );
// add PersistentAttributeInterceptor contract
this.entityEntryCtClass = loadCtClassFromClass( classPool, EntityEntry.class ); this.entityEntryCtClass = loadCtClassFromClass( classPool, EntityEntry.class );
} }
catch (IOException e) { catch (IOException e) {
@ -125,7 +121,7 @@ public class Enhancer {
private void enhance(CtClass managedCtClass) { private void enhance(CtClass managedCtClass) {
// can't effectively enhance interfaces // can't effectively enhance interfaces
if ( managedCtClass.isInterface() ) { if ( managedCtClass.isInterface() ) {
log.debugf( "Skipping enhancement of [%s]: it's an interface", managedCtClass ); log.debugf( "Skipping enhancement of [%s]: it's an interface!", managedCtClass.getName() );
return; return;
} }
// skip already enhanced classes // skip already enhanced classes
@ -149,7 +145,7 @@ public class Enhancer {
new PersistentAttributesEnhancer( enhancementContext ).enhanceFieldAccess( managedCtClass ); new PersistentAttributesEnhancer( enhancementContext ).enhanceFieldAccess( managedCtClass );
} }
else { else {
log.debug( "Skipping enhancement: not entity or composite" ); log.debugf( "Skipping enhancement of [%s]: not entity or composite", managedCtClass.getName() );
} }
} }

View File

@ -6,12 +6,10 @@
*/ */
package org.hibernate.property.access.internal; package org.hibernate.property.access.internal;
import java.lang.reflect.Method;
import org.hibernate.EntityMode; import org.hibernate.EntityMode;
import org.hibernate.HibernateException; import org.hibernate.HibernateException;
import org.hibernate.boot.registry.selector.spi.StrategySelector; import org.hibernate.boot.registry.selector.spi.StrategySelector;
import org.hibernate.bytecode.enhance.spi.EnhancerConstants; import org.hibernate.engine.spi.Managed;
import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.StringHelper;
import org.hibernate.property.access.spi.BuiltInPropertyAccessStrategies; import org.hibernate.property.access.spi.BuiltInPropertyAccessStrategies;
import org.hibernate.property.access.spi.PropertyAccessStrategy; import org.hibernate.property.access.spi.PropertyAccessStrategy;
@ -36,7 +34,7 @@ public class PropertyAccessStrategyResolverStandardImpl implements PropertyAcces
String explicitAccessStrategyName, String explicitAccessStrategyName,
EntityMode entityMode) { EntityMode entityMode) {
if ( hasBytecodeEnhancedAttributes( containerClass ) ) { if ( Managed.class.isAssignableFrom( containerClass ) ) {
return PropertyAccessStrategyEnhancedImpl.INSTANCE; return PropertyAccessStrategyEnhancedImpl.INSTANCE;
} }
@ -75,14 +73,4 @@ public class PropertyAccessStrategyResolverStandardImpl implements PropertyAcces
return strategySelectorService; return strategySelectorService;
} }
private boolean hasBytecodeEnhancedAttributes(Class<?> containerClass) {
for ( Method m : containerClass.getDeclaredMethods() ) {
if ( m.getName().startsWith( EnhancerConstants.PERSISTENT_FIELD_READER_PREFIX ) ||
m.getName().startsWith( EnhancerConstants.PERSISTENT_FIELD_WRITER_PREFIX ) ) {
return true;
}
}
return false;
}
} }