Skip to content

Commit 54cd8eb

Browse files
committed
HHH-11563 - Avoid calling multiple times org.hibernate.mapping.Component#getComponentClass() during the PojoComponentTuplizer creation
1 parent f120cd2 commit 54cd8eb

File tree

3 files changed

+24
-15
lines changed

3 files changed

+24
-15
lines changed

hibernate-core/src/main/java/org/hibernate/tuple/PojoInstantiator.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,11 @@ public PojoInstantiator(
5050
}
5151

5252
public PojoInstantiator(Component component, ReflectionOptimizer.InstantiationOptimizer optimizer) {
53-
this.mappedClass = component.getComponentClass();
53+
this( component.getComponentClass(), optimizer );
54+
}
55+
56+
public PojoInstantiator(Class componentClass, ReflectionOptimizer.InstantiationOptimizer optimizer) {
57+
this.mappedClass = componentClass;
5458
this.isAbstract = ReflectHelper.isAbstractClass( mappedClass );
5559
this.optimizer = optimizer;
5660

hibernate-core/src/main/java/org/hibernate/tuple/component/AbstractComponentTuplizer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public abstract class AbstractComponentTuplizer implements ComponentTuplizer {
3434
protected abstract Setter buildSetter(Component component, Property prop);
3535

3636
protected AbstractComponentTuplizer(Component component) {
37+
setComponentClass( component );
3738
propertySpan = component.getPropertySpan();
3839
getters = new Getter[propertySpan];
3940
setters = new Setter[propertySpan];
@@ -102,4 +103,8 @@ public void setParent(Object component, Object parent, SessionFactoryImplementor
102103
public Getter getGetter(int i) {
103104
return getters[i];
104105
}
106+
107+
// It should be an abstract method but not sure if this can break any customer extension
108+
protected void setComponentClass(Component component){
109+
}
105110
}

hibernate-core/src/main/java/org/hibernate/tuple/component/PojoComponentTuplizer.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import org.hibernate.property.access.spi.Getter;
2323
import org.hibernate.property.access.spi.PropertyAccess;
2424
import org.hibernate.property.access.spi.Setter;
25-
import org.hibernate.service.ServiceRegistry;
2625
import org.hibernate.tuple.Instantiator;
2726
import org.hibernate.tuple.PojoInstantiator;
2827

@@ -33,16 +32,14 @@
3332
* @author Steve Ebersole
3433
*/
3534
public class PojoComponentTuplizer extends AbstractComponentTuplizer {
36-
private final Class componentClass;
35+
private Class componentClass;
3736
private ReflectionOptimizer optimizer;
3837
private final Getter parentGetter;
3938
private final Setter parentSetter;
4039

4140
public PojoComponentTuplizer(Component component) {
4241
super( component );
4342

44-
this.componentClass = component.getComponentClass();
45-
4643
String[] getterNames = new String[propertySpan];
4744
String[] setterNames = new String[propertySpan];
4845
Class[] propTypes = new Class[propertySpan];
@@ -58,8 +55,6 @@ public PojoComponentTuplizer(Component component) {
5855
parentGetter = null;
5956
}
6057
else {
61-
final ServiceRegistry serviceRegistry =
62-
component.getMetadata().getMetadataBuildingOptions().getServiceRegistry();
6358
final PropertyAccess propertyAccess = PropertyAccessStrategyBasicImpl.INSTANCE.buildPropertyAccess(
6459
componentClass,
6560
parentPropertyName
@@ -128,31 +123,36 @@ public void setParent(Object component, Object parent, SessionFactoryImplementor
128123
}
129124

130125
protected Instantiator buildInstantiator(Component component) {
131-
if ( component.isEmbedded() && ReflectHelper.isAbstractClass( component.getComponentClass() ) ) {
132-
return new ProxiedInstantiator( component );
126+
if ( component.isEmbedded() && ReflectHelper.isAbstractClass( this.componentClass ) ) {
127+
return new ProxiedInstantiator( this.componentClass );
133128
}
134129
if ( optimizer == null ) {
135-
return new PojoInstantiator( component, null );
130+
return new PojoInstantiator( this.componentClass, null );
136131
}
137132
else {
138-
return new PojoInstantiator( component, optimizer.getInstantiationOptimizer() );
133+
return new PojoInstantiator( this.componentClass, optimizer.getInstantiationOptimizer() );
139134
}
140135
}
141136

142137
protected Getter buildGetter(Component component, Property prop) {
143-
return prop.getGetter( component.getComponentClass() );
138+
return prop.getGetter( this.componentClass );
144139
}
145140

146141
protected Setter buildSetter(Component component, Property prop) {
147-
return prop.getSetter( component.getComponentClass() );
142+
return prop.getSetter( this.componentClass );
143+
}
144+
145+
@Override
146+
protected void setComponentClass(Component component) {
147+
this.componentClass = component.getComponentClass();
148148
}
149149

150150
private static class ProxiedInstantiator implements Instantiator {
151151
private final Class proxiedClass;
152152
private final BasicProxyFactory factory;
153153

154-
public ProxiedInstantiator(Component component) {
155-
proxiedClass = component.getComponentClass();
154+
public ProxiedInstantiator(Class componentClass) {
155+
proxiedClass = componentClass;
156156
if ( proxiedClass.isInterface() ) {
157157
factory = Environment.getBytecodeProvider()
158158
.getProxyFactoryFactory()

0 commit comments

Comments
 (0)