@@ -116,6 +116,9 @@ the following fields are used in all circumstances, and are not worth (or not su
116
116
// Loaded entity instances, by EntityKey
117
117
private HashMap <EntityKey , EntityHolderImpl > entitiesByKey ;
118
118
119
+ // New entity holder cached instance
120
+ private EntityHolderImpl newEntityHolder ;
121
+
119
122
// Loaded entity instances, by EntityUniqueKey
120
123
private HashMap <EntityUniqueKey , Object > entitiesByUniqueKey ;
121
124
@@ -182,6 +185,13 @@ private Map<EntityKey, EntityHolderImpl> getOrInitializeEntitiesByKey() {
182
185
return entitiesByKey ;
183
186
}
184
187
188
+ private EntityHolderImpl getOrInitializeNewHolder () {
189
+ if ( newEntityHolder == null ) {
190
+ return newEntityHolder = new EntityHolderImpl ();
191
+ }
192
+ return newEntityHolder ;
193
+ }
194
+
185
195
@ Override
186
196
public boolean isStateless () {
187
197
return false ;
@@ -390,8 +400,8 @@ public EntityHolder claimEntityHolderIfPossible(
390
400
JdbcValuesSourceProcessingState processingState ,
391
401
EntityInitializer <?> initializer ) {
392
402
final Map <EntityKey , EntityHolderImpl > entityHolderMap = getOrInitializeEntitiesByKey ();
393
- final EntityHolderImpl oldHolder = entityHolderMap . get ( key );
394
- final EntityHolderImpl holder ;
403
+ EntityHolderImpl holder = getOrInitializeNewHolder (). withEntity ( key , key . getPersister (), entity );
404
+ final EntityHolderImpl oldHolder = entityHolderMap . putIfAbsent ( key , newEntityHolder ) ;
395
405
if ( oldHolder != null ) {
396
406
if ( entity != null ) {
397
407
assert oldHolder .entity == null || oldHolder .entity == entity ;
@@ -411,7 +421,7 @@ public EntityHolder claimEntityHolderIfPossible(
411
421
holder = oldHolder ;
412
422
}
413
423
else {
414
- entityHolderMap . put ( key , holder = EntityHolderImpl . forEntity ( key , key . getPersister (), entity ) ) ;
424
+ newEntityHolder = null ;
415
425
}
416
426
assert holder .entityInitializer == null || holder .entityInitializer == initializer ;
417
427
holder .entityInitializer = initializer ;
@@ -494,16 +504,14 @@ public void addEntity(EntityKey key, Object entity) {
494
504
@ Override
495
505
public EntityHolder addEntityHolder (EntityKey key , Object entity ) {
496
506
final Map <EntityKey , EntityHolderImpl > entityHolderMap = getOrInitializeEntitiesByKey ();
497
- final EntityHolderImpl oldHolder = entityHolderMap . get ( key );
498
- final EntityHolderImpl holder ;
507
+ EntityHolderImpl holder = getOrInitializeNewHolder (). withEntity ( key , key . getPersister (), entity );
508
+ final EntityHolderImpl oldHolder = entityHolderMap . putIfAbsent ( key , holder ) ;
499
509
if ( oldHolder != null ) {
500
- // assert oldHolder.entity == null || oldHolder.entity == entity;
501
510
oldHolder .entity = entity ;
502
511
holder = oldHolder ;
503
512
}
504
513
else {
505
- holder = EntityHolderImpl .forEntity ( key , key .getPersister (), entity );
506
- entityHolderMap .put ( key , holder );
514
+ newEntityHolder = null ;
507
515
}
508
516
holder .state = EntityHolderState .INITIALIZED ;
509
517
final BatchFetchQueue fetchQueue = this .batchFetchQueue ;
@@ -783,14 +791,15 @@ private void reassociateProxy(LazyInitializer li, HibernateProxy proxy) {
783
791
final EntityKey key = session .generateEntityKey ( li .getInternalIdentifier (), persister );
784
792
// any earlier proxy takes precedence
785
793
final Map <EntityKey , EntityHolderImpl > entityHolderMap = getOrInitializeEntitiesByKey ();
786
- final EntityHolderImpl oldHolder = entityHolderMap .get ( key );
794
+ final EntityHolderImpl holder = getOrInitializeNewHolder ().withProxy ( key , persister , proxy );
795
+ final EntityHolderImpl oldHolder = entityHolderMap .putIfAbsent ( key , holder );
787
796
if ( oldHolder != null ) {
788
797
if ( oldHolder .proxy == null ) {
789
798
oldHolder .proxy = proxy ;
790
799
}
791
800
}
792
801
else {
793
- entityHolderMap . put ( key , EntityHolderImpl . forProxy ( key , persister , proxy ) ) ;
802
+ newEntityHolder = null ;
794
803
}
795
804
proxy .getHibernateLazyInitializer ().setSession ( session );
796
805
}
@@ -929,16 +938,16 @@ public Object proxyFor(EntityHolder holder, EntityPersister persister) {
929
938
@ Override
930
939
public void addEnhancedProxy (EntityKey key , PersistentAttributeInterceptable entity ) {
931
940
final Map <EntityKey , EntityHolderImpl > entityHolderMap = getOrInitializeEntitiesByKey ();
932
- final EntityHolderImpl oldHolder = entityHolderMap . get ( key );
933
- final EntityHolderImpl holder ;
941
+ final EntityHolderImpl holder = getOrInitializeNewHolder (). withEntity ( key , key . getPersister (), entity );
942
+ final EntityHolderImpl oldHolder = entityHolderMap . putIfAbsent ( key , holder ) ;
934
943
if ( oldHolder != null ) {
935
944
oldHolder .entity = entity ;
936
- holder = oldHolder ;
945
+ oldHolder . state = EntityHolderState . ENHANCED_PROXY ;
937
946
}
938
947
else {
939
- entityHolderMap .put ( key , holder = EntityHolderImpl .forEntity ( key , key .getPersister (), entity ) );
948
+ newEntityHolder = null ;
949
+ holder .state = EntityHolderState .ENHANCED_PROXY ;
940
950
}
941
- holder .state = EntityHolderState .ENHANCED_PROXY ;
942
951
}
943
952
944
953
@ Override
@@ -1229,12 +1238,13 @@ public Object getProxy(EntityKey key) {
1229
1238
@ Override
1230
1239
public void addProxy (EntityKey key , Object proxy ) {
1231
1240
final Map <EntityKey , EntityHolderImpl > entityHolderMap = getOrInitializeEntitiesByKey ();
1232
- final EntityHolderImpl holder = entityHolderMap .get ( key );
1233
- if ( holder != null ) {
1234
- holder .proxy = proxy ;
1241
+ final EntityHolderImpl holder = getOrInitializeNewHolder ().withProxy ( key , key .getPersister (), proxy );
1242
+ final EntityHolderImpl oldHolder = entityHolderMap .putIfAbsent ( key , holder );
1243
+ if ( oldHolder != null ) {
1244
+ oldHolder .proxy = proxy ;
1235
1245
}
1236
1246
else {
1237
- entityHolderMap . put ( key , EntityHolderImpl . forProxy ( key , key . getPersister (), proxy ) ) ;
1247
+ newEntityHolder = null ;
1238
1248
}
1239
1249
}
1240
1250
@@ -1960,7 +1970,7 @@ public static StatefulPersistenceContext deserialize(
1960
1970
final Object entity = ois .readObject ();
1961
1971
final Object proxy = ois .readObject ();
1962
1972
final EntityHolderState state = (EntityHolderState ) ois .readObject ();
1963
- final EntityHolderImpl holder = EntityHolderImpl . forEntity ( ek , persister , entity );
1973
+ final EntityHolderImpl holder = new EntityHolderImpl (). withEntity ( ek , persister , entity );
1964
1974
holder .state = state ;
1965
1975
if ( proxy != null ) {
1966
1976
final LazyInitializer lazyInitializer = extractLazyInitializer ( proxy );
@@ -2177,20 +2187,15 @@ private void cleanUpInsertedKeysAfterTransaction() {
2177
2187
}
2178
2188
2179
2189
private static class EntityHolderImpl implements EntityHolder , Serializable {
2180
- private final EntityKey entityKey ;
2181
- private final EntityPersister descriptor ;
2182
- Object entity ;
2183
- Object proxy ;
2184
- @ Nullable EntityEntry entityEntry ;
2185
- EntityInitializer <?> entityInitializer ;
2186
- EntityHolderState state ;
2187
-
2188
- private EntityHolderImpl (EntityKey entityKey , EntityPersister descriptor , Object entity , Object proxy ) {
2189
- assert entityKey != null && descriptor != null ;
2190
- this .entityKey = entityKey ;
2191
- this .descriptor = descriptor ;
2192
- this .entity = entity ;
2193
- this .proxy = proxy ;
2190
+ private EntityKey entityKey ;
2191
+ private EntityPersister descriptor ;
2192
+ private Object entity ;
2193
+ private Object proxy ;
2194
+ private @ Nullable EntityEntry entityEntry ;
2195
+ private EntityInitializer <?> entityInitializer ;
2196
+ private EntityHolderState state ;
2197
+
2198
+ private EntityHolderImpl () {
2194
2199
this .state = EntityHolderState .UNINITIALIZED ;
2195
2200
}
2196
2201
@@ -2249,12 +2254,21 @@ public boolean isDetached() {
2249
2254
return state == EntityHolderState .DETACHED ;
2250
2255
}
2251
2256
2252
- public static EntityHolderImpl forProxy (EntityKey entityKey , EntityPersister descriptor , Object proxy ) {
2253
- return new EntityHolderImpl ( entityKey , descriptor , null , proxy );
2257
+ public EntityHolderImpl withEntity (EntityKey entityKey , EntityPersister descriptor , Object entity ) {
2258
+ return withData ( entityKey , descriptor , entity , null );
2259
+ }
2260
+
2261
+ public EntityHolderImpl withProxy (EntityKey entityKey , EntityPersister descriptor , Object proxy ) {
2262
+ return withData ( entityKey , descriptor , null , proxy );
2254
2263
}
2255
2264
2256
- public static EntityHolderImpl forEntity (EntityKey entityKey , EntityPersister descriptor , Object entity ) {
2257
- return new EntityHolderImpl ( entityKey , descriptor , entity , null );
2265
+ public EntityHolderImpl withData (EntityKey entityKey , EntityPersister descriptor , Object entity , Object proxy ) {
2266
+ assert entityKey != null && descriptor != null && entityInitializer == null && state == EntityHolderState .UNINITIALIZED ;
2267
+ this .entityKey = entityKey ;
2268
+ this .descriptor = descriptor ;
2269
+ this .entity = entity ;
2270
+ this .proxy = proxy ;
2271
+ return this ;
2258
2272
}
2259
2273
}
2260
2274
0 commit comments