Skip to content

Commit e4bc19b

Browse files
committed
HHH-18410 Make use of getter/setter cache as much as possible
1 parent f810f64 commit e4bc19b

25 files changed

+167
-109
lines changed

hibernate-core/src/main/java/org/hibernate/action/internal/AbstractEntityInsertAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,14 +180,14 @@ private void visitEmbeddedAttributeMapping(
180180
if ( attribute.isPluralAttributeMapping() ) {
181181
addCollectionKey(
182182
attribute.asPluralAttributeMapping(),
183-
attribute.getPropertyAccess().getGetter().get( object ),
183+
attribute.getValue( object ),
184184
persistenceContext
185185
);
186186
}
187187
else if ( attribute.isEmbeddedAttributeMapping() ) {
188188
visitEmbeddedAttributeMapping(
189189
attribute.asEmbeddedAttributeMapping(),
190-
attribute.getPropertyAccess().getGetter().get( object ),
190+
attribute.getValue( object ),
191191
persistenceContext
192192
);
193193
}

hibernate-core/src/main/java/org/hibernate/engine/internal/Cascade.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,16 @@ public static <T> void cascade(
8787
LOG.tracev( "Processing cascade {0} for: {1}", action, persister.getEntityName() );
8888
}
8989
final PersistenceContext persistenceContext = eventSource.getPersistenceContextInternal();
90-
final EntityEntry entry = persistenceContext.getEntry( parent );
91-
if ( entry != null && entry.getLoadedState() == null && entry.getStatus() == Status.MANAGED && persister.getBytecodeEnhancementMetadata()
92-
.isEnhancedForLazyLoading() ) {
93-
return;
90+
final boolean enhancedForLazyLoading = persister.getBytecodeEnhancementMetadata().isEnhancedForLazyLoading();
91+
final EntityEntry entry;
92+
if ( enhancedForLazyLoading ) {
93+
entry = persistenceContext.getEntry( parent );
94+
if ( entry != null && entry.getLoadedState() == null && entry.getStatus() == Status.MANAGED ) {
95+
return;
96+
}
97+
}
98+
else {
99+
entry = null;
94100
}
95101
final Type[] types = persister.getPropertyTypes();
96102
final String[] propertyNames = persister.getPropertyNames();
@@ -108,6 +114,7 @@ public static <T> void cascade(
108114
if ( style.doCascade( action ) ) {
109115
final Object child;
110116
if ( isUninitializedProperty ) {
117+
assert enhancedForLazyLoading;
111118
// parent is a bytecode enhanced entity.
112119
// Cascade to an uninitialized, lazy value only if
113120
// parent is managed in the PersistenceContext.
@@ -217,7 +224,7 @@ private static <T> void cascadeProperty(
217224
final String propertyName,
218225
final T anything,
219226
final boolean isCascadeDeleteEnabled) throws HibernateException {
220-
227+
221228
if ( child != null ) {
222229
if ( type.isAssociationType() ) {
223230
final AssociationType associationType = (AssociationType) type;
@@ -379,7 +386,7 @@ private static <T> void cascadeLogicalOneToOneOrphanRemoval(
379386
* @return True if the attribute represents a logical one to one association
380387
*/
381388
private static boolean isLogicalOneToOne(Type type) {
382-
return type.isEntityType() && ( (EntityType) type ).isLogicalOneToOne();
389+
return type instanceof EntityType && ( (EntityType) type ).isLogicalOneToOne();
383390
}
384391

385392
private static boolean cascadeAssociationNow(final CascadePoint cascadePoint, AssociationType associationType) {

hibernate-core/src/main/java/org/hibernate/engine/internal/Collections.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,7 @@ public static void processReachableCollection(
145145
Object entity,
146146
SessionImplementor session) {
147147
collection.setOwner( entity );
148-
final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
149-
final CollectionEntry ce = persistenceContext.getCollectionEntry( collection );
148+
final CollectionEntry ce = session.getPersistenceContextInternal().getCollectionEntry( collection );
150149

151150
if ( ce == null ) {
152151
// refer to comment in StatefulPersistenceContext.addCollection()

hibernate-core/src/main/java/org/hibernate/engine/internal/StatefulPersistenceContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1103,7 +1103,7 @@ public int getNumberOfManagedEntities() {
11031103
@Override
11041104
@Deprecated
11051105
public Map<PersistentCollection<?>,CollectionEntry> getCollectionEntries() {
1106-
return getOrInitializeCollectionEntries();
1106+
return collectionEntries;
11071107
}
11081108

11091109
@Override

hibernate-core/src/main/java/org/hibernate/event/internal/AbstractFlushingEventListener.java

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@
1414
import org.hibernate.action.internal.CollectionRemoveAction;
1515
import org.hibernate.action.internal.CollectionUpdateAction;
1616
import org.hibernate.action.internal.QueuedOperationCollectionAction;
17+
import org.hibernate.collection.spi.PersistentCollection;
1718
import org.hibernate.engine.internal.Cascade;
1819
import org.hibernate.engine.internal.CascadePoint;
1920
import org.hibernate.engine.internal.Collections;
2021
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
2122
import org.hibernate.engine.spi.ActionQueue;
2223
import org.hibernate.engine.spi.CascadingAction;
2324
import org.hibernate.engine.spi.CascadingActions;
25+
import org.hibernate.engine.spi.CollectionEntry;
2426
import org.hibernate.engine.spi.CollectionKey;
2527
import org.hibernate.engine.spi.EntityEntry;
2628
import org.hibernate.engine.spi.PersistenceContext;
@@ -35,6 +37,7 @@
3537
import org.hibernate.event.spi.PersistContext;
3638
import org.hibernate.internal.CoreMessageLogger;
3739
import org.hibernate.internal.util.EntityPrinter;
40+
import org.hibernate.internal.util.collections.IdentityMap;
3841
import org.hibernate.persister.entity.EntityPersister;
3942

4043
import org.jboss.logging.Logger;
@@ -183,7 +186,12 @@ private void prepareCollectionFlushes(PersistenceContext persistenceContext) thr
183186
// and reset reached, doupdate, etc.
184187

185188
LOG.debug( "Dirty checking collections" );
186-
persistenceContext.forEachCollectionEntry( (pc,ce) -> ce.preFlush( pc ), true );
189+
final Map<PersistentCollection<?>, CollectionEntry> collectionEntries = persistenceContext.getCollectionEntries();
190+
if ( collectionEntries != null ) {
191+
for ( Map.Entry<PersistentCollection<?>, CollectionEntry> entry : ( (IdentityMap<PersistentCollection<?>, CollectionEntry>) collectionEntries ).entryArray() ) {
192+
entry.getValue().preFlush( entry.getKey() );
193+
}
194+
}
187195
}
188196

189197
/**
@@ -263,14 +271,20 @@ private int flushCollections(final EventSource session, final PersistenceContext
263271
throws HibernateException {
264272
LOG.trace( "Processing unreferenced collections" );
265273

266-
final int count = persistenceContext.getCollectionEntriesSize();
267-
268-
persistenceContext.forEachCollectionEntry(
269-
(persistentCollection, collectionEntry) -> {
270-
if ( !collectionEntry.isReached() && !collectionEntry.isIgnore() ) {
271-
Collections.processUnreachableCollection( persistentCollection, session );
272-
}
273-
}, true );
274+
final Map<PersistentCollection<?>, CollectionEntry> collectionEntries = persistenceContext.getCollectionEntries();
275+
final int count;
276+
if ( collectionEntries == null ) {
277+
count = 0;
278+
}
279+
else {
280+
count = collectionEntries.size();
281+
for ( Map.Entry<PersistentCollection<?>, CollectionEntry> me : ( (IdentityMap<PersistentCollection<?>, CollectionEntry>) collectionEntries ).entryArray() ) {
282+
final CollectionEntry ce = me.getValue();
283+
if ( !ce.isReached() && !ce.isIgnore() ) {
284+
Collections.processUnreachableCollection( me.getKey(), session );
285+
}
286+
}
287+
}
274288

275289
// Schedule updates to collections:
276290

hibernate-core/src/main/java/org/hibernate/event/internal/DefaultMergeEventListener.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,8 +351,7 @@ protected Object processCollection(Object collection, CollectionType collectionT
351351
.getMappingMetamodel()
352352
.getCollectionDescriptor( collectionType.getRole() );
353353
final CollectionEntry collectionEntry = getSession().getPersistenceContextInternal()
354-
.getCollectionEntries()
355-
.get( coll );
354+
.getCollectionEntry( coll );
356355
if ( !coll.equalsSnapshot( persister ) ) {
357356
collectionEntry.resetStoredSnapshot( coll, coll.getSnapshot( persister ) );
358357
}

hibernate-core/src/main/java/org/hibernate/internal/util/collections/IdentityMap.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public final class IdentityMap<K,V> implements Map<K,V> {
2424

2525
private final LinkedHashMap<IdentityKey<K>,V> map;
2626

27-
private transient Entry<IdentityKey<K>,V>[] entryArray = null;
27+
private transient Entry<K,V>[] entryArray = null;
2828

2929
/**
3030
* Return a new instance of this class, with iteration
@@ -151,15 +151,14 @@ public Set<Entry<K,V>> entrySet() {
151151
return set;
152152
}
153153

154-
@SuppressWarnings( {"unchecked"})
155-
public Entry[] entryArray() {
154+
public Entry<K,V>[] entryArray() {
156155
if ( entryArray == null ) {
157156
entryArray = new Entry[ map.size() ];
158157
final Iterator<Entry<IdentityKey<K>, V>> itr = map.entrySet().iterator();
159158
int i = 0;
160159
while ( itr.hasNext() ) {
161160
final Entry<IdentityKey<K>, V> me = itr.next();
162-
entryArray[i++] = new IdentityMapEntry( me.getKey().key, me.getValue() );
161+
entryArray[i++] = new IdentityMapEntry<>( me.getKey().key, me.getValue() );
163162
}
164163
}
165164
return entryArray;

hibernate-core/src/main/java/org/hibernate/metamodel/internal/AbstractCompositeIdentifierMapping.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ public <X, Y> int forEachJdbcValue(
186186
else {
187187
for ( int i = 0; i < size; i++ ) {
188188
final AttributeMapping attributeMapping = embeddableTypeDescriptor.getAttributeMapping( i );
189-
final Object o = attributeMapping.getPropertyAccess().getGetter().get( value );
189+
final Object o = embeddableTypeDescriptor.getValue( value, i );
190190
if ( attributeMapping instanceof ToOneAttributeMapping ) {
191191
final ToOneAttributeMapping toOneAttributeMapping = (ToOneAttributeMapping) attributeMapping;
192192
final ForeignKeyDescriptor fkDescriptor = toOneAttributeMapping.getForeignKeyDescriptor();

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/AttributeMapping.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,14 @@ default String getPartName() {
5959
* Convenient access to getting the value for this attribute from the declarer
6060
*/
6161
default Object getValue(Object container) {
62-
return getPropertyAccess().getGetter().get( container );
62+
return getDeclaringType().getValue( container, getStateArrayPosition() );
6363
}
6464

6565
/**
6666
* Convenient access to setting the value for this attribute on the declarer
6767
*/
6868
default void setValue(Object container, Object value) {
69-
getPropertyAccess().getSetter().set( container, value );
69+
getDeclaringType().setValue( container, getStateArrayPosition(), value );
7070
}
7171

7272
/**

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/EmbeddableMappingType.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -267,9 +267,8 @@ default void applySqlSelections(
267267
default int compare(Object value1, Object value2) {
268268
final AttributeMappingsList attributeMappings = getAttributeMappings();
269269
for ( int i = 0; i < attributeMappings.size(); i++ ) {
270-
AttributeMapping attributeMapping = attributeMappings.get( i );
271-
final Getter getter = attributeMapping.getPropertyAccess().getGetter();
272-
final int comparison = attributeMapping.compare( getter.get( value1 ), getter.get( value2 ) );
270+
final AttributeMapping attribute = attributeMappings.get( i );
271+
final int comparison = attribute.compare( attribute.getValue( value1 ), attribute.getValue( value2 ) );
273272
if ( comparison != 0 ) {
274273
return comparison;
275274
}

0 commit comments

Comments
 (0)