|
20 | 20 | import java.lang.reflect.InvocationTargetException; |
21 | 21 | import java.util.IdentityHashMap; |
22 | 22 | import java.util.Map; |
| 23 | +import java.util.Objects; |
23 | 24 | import java.util.function.Consumer; |
24 | 25 |
|
25 | 26 | import static org.hibernate.engine.internal.ManagedTypeHelper.asManagedEntity; |
@@ -161,14 +162,13 @@ private static boolean isReferenceCachingEnabled(EntityPersister persister) { |
161 | 162 | private ManagedEntity getAssociatedManagedEntity(Object entity) { |
162 | 163 | if ( isManagedEntity( entity ) ) { |
163 | 164 | final var managedEntity = asManagedEntity( entity ); |
164 | | - if ( managedEntity.$$_hibernate_getEntityEntry() == null ) { |
165 | | - // it is not associated |
166 | | - return null; |
167 | | - } |
168 | 165 | final var entityEntry = |
169 | 166 | (EntityEntryImpl) |
170 | 167 | managedEntity.$$_hibernate_getEntityEntry(); |
171 | | - |
| 168 | + if ( entityEntry == null ) { |
| 169 | + // it is not associated |
| 170 | + return null; |
| 171 | + } |
172 | 172 | if ( entityEntry.getPersister().isMutable() ) { |
173 | 173 | return entityEntry.getPersistenceContext() == persistenceContext |
174 | 174 | ? managedEntity // it is associated |
@@ -313,7 +313,8 @@ public EntityEntry removeEntityEntry(Object entity) { |
313 | 313 | private void removeXref(Object entity, ManagedEntity managedEntity) { |
314 | 314 | if ( managedEntity instanceof ImmutableManagedEntityHolder holder ) { |
315 | 315 | assert entity == holder.managedEntity; |
316 | | - if ( !isReferenceCachingEnabled( holder.$$_hibernate_getEntityEntry().getPersister() ) ) { |
| 316 | + final var entry = holder.$$_hibernate_getEntityEntry(); |
| 317 | + if ( entry != null && !isReferenceCachingEnabled( entry.getPersister() ) ) { |
317 | 318 | immutableManagedEntityXref.remove( managedEntity.$$_hibernate_getInstanceId(), entity ); |
318 | 319 | } |
319 | 320 | else { |
@@ -449,13 +450,14 @@ public void serialize(ObjectOutputStream oos) throws IOException { |
449 | 450 | var managedEntity = head; |
450 | 451 | while ( managedEntity != null ) { |
451 | 452 | // so we know whether or not to build a ManagedEntityImpl on deserialize |
452 | | - final Object instance = managedEntity.$$_hibernate_getEntityInstance(); |
| 453 | + final var instance = managedEntity.$$_hibernate_getEntityInstance(); |
453 | 454 | oos.writeBoolean( managedEntity == instance ); |
454 | 455 | oos.writeObject( instance ); |
455 | 456 | // we need to know which implementation of EntityEntry is being serialized |
456 | | - oos.writeInt( managedEntity.$$_hibernate_getEntityEntry().getClass().getName().length() ); |
457 | | - oos.writeChars( managedEntity.$$_hibernate_getEntityEntry().getClass().getName() ); |
458 | | - managedEntity.$$_hibernate_getEntityEntry().serialize( oos ); |
| 457 | + final var entry = Objects.requireNonNull(managedEntity.$$_hibernate_getEntityEntry()); |
| 458 | + oos.writeInt( entry.getClass().getName().length() ); |
| 459 | + oos.writeChars( entry.getClass().getName() ); |
| 460 | + entry.serialize( oos ); |
459 | 461 | managedEntity = managedEntity.$$_hibernate_getNextManagedEntity(); |
460 | 462 | } |
461 | 463 | } |
@@ -722,6 +724,9 @@ public ImmutableManagedEntityHolder(ManagedEntity immutableManagedEntity) { |
722 | 724 | // Check instance type of EntityEntry and if type is ImmutableEntityEntry, |
723 | 725 | // check to see if entity is referenced cached in the second level cache |
724 | 726 | private static boolean canClearEntityEntryReference(EntityEntry entityEntry) { |
| 727 | + if (entityEntry == null) { |
| 728 | + return false; |
| 729 | + } |
725 | 730 | final EntityPersister persister = entityEntry.getPersister(); |
726 | 731 | return persister.isMutable() || !isReferenceCachingEnabled( persister ); |
727 | 732 | } |
|
0 commit comments