diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/internal/BytecodeEnhancementMetadataPojoImpl.java b/hibernate-core/src/main/java/org/hibernate/bytecode/internal/BytecodeEnhancementMetadataPojoImpl.java index e57cbfc310c0..5fa52a96880b 100644 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/internal/BytecodeEnhancementMetadataPojoImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/bytecode/internal/BytecodeEnhancementMetadataPojoImpl.java @@ -91,8 +91,9 @@ public static BytecodeEnhancementMetadata from( this.identifierAttributeNames = identifierAttributeNames; this.enhancedForLazyLoading = enhancedForLazyLoading; this.lazyAttributesMetadata = lazyAttributesMetadata; - this.lazyAttributeLoadingInterceptorState = new LazyAttributeLoadingInterceptor.EntityRelatedState( - getEntityName(), lazyAttributesMetadata.getLazyAttributeNames() ); + this.lazyAttributeLoadingInterceptorState = + new LazyAttributeLoadingInterceptor.EntityRelatedState( getEntityName(), + lazyAttributesMetadata.getLazyAttributeNames() ); } @Override @@ -116,7 +117,7 @@ public boolean hasUnFetchedAttributes(Object entity) { return false; } - final BytecodeLazyAttributeInterceptor interceptor = extractLazyInterceptor( entity ); + final var interceptor = extractLazyInterceptor( entity ); if ( interceptor instanceof LazyAttributeLoadingInterceptor ) { return interceptor.hasAnyUninitializedAttributes(); } diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/internal/BytecodeProviderInitiator.java b/hibernate-core/src/main/java/org/hibernate/bytecode/internal/BytecodeProviderInitiator.java index a7433e15074f..b5f1dbfc2aa3 100644 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/internal/BytecodeProviderInitiator.java +++ b/hibernate-core/src/main/java/org/hibernate/bytecode/internal/BytecodeProviderInitiator.java @@ -4,8 +4,6 @@ */ package org.hibernate.bytecode.internal; -import java.util.Collection; -import java.util.Iterator; import java.util.Map; import java.util.ServiceLoader; @@ -30,7 +28,7 @@ public final class BytecodeProviderInitiator implements StandardServiceInitiator @Override public BytecodeProvider initiateService(Map configurationValues, ServiceRegistryImplementor registry) { - final Collection bytecodeProviders = + final var bytecodeProviders = registry.requireService( ClassLoaderService.class ) .loadJavaServices( BytecodeProvider.class ); return getBytecodeProvider( bytecodeProviders ); @@ -52,16 +50,18 @@ public static BytecodeProvider buildDefaultBytecodeProvider() { @Internal public static BytecodeProvider getBytecodeProvider(Iterable bytecodeProviders) { - final Iterator iterator = bytecodeProviders.iterator(); + final var iterator = bytecodeProviders.iterator(); if ( !iterator.hasNext() ) { // If no BytecodeProvider service is available, default to the "no-op" enhancer return new org.hibernate.bytecode.internal.none.BytecodeProviderImpl(); } - - final BytecodeProvider provider = iterator.next(); - if ( iterator.hasNext() ) { - throw new IllegalStateException( "Found multiple BytecodeProvider service registrations, cannot determine which one to use" ); + else { + final var provider = iterator.next(); + if ( iterator.hasNext() ) { + throw new IllegalStateException( + "Found multiple BytecodeProvider service registrations, cannot determine which one to use" ); + } + return provider; } - return provider; } } diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractFlushingEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractFlushingEventListener.java index c5a08e765af6..c616f3ed6b7e 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractFlushingEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractFlushingEventListener.java @@ -5,6 +5,7 @@ package org.hibernate.event.internal; import java.lang.invoke.MethodHandles; +import java.util.Map; import org.hibernate.HibernateException; import org.hibernate.Interceptor; @@ -15,7 +16,6 @@ import org.hibernate.collection.spi.PersistentCollection; import org.hibernate.engine.internal.Cascade; import org.hibernate.engine.internal.CascadePoint; -import org.hibernate.engine.spi.ActionQueue; import org.hibernate.engine.spi.CascadingActions; import org.hibernate.engine.spi.CollectionEntry; import org.hibernate.engine.spi.CollectionKey; @@ -143,15 +143,15 @@ void checkForTransientReferences(EventSource session, PersistenceContext persist // processed, so that all entities which will be persisted are // persistent when we do the check (I wonder if we could move this // into Nullability, instead of abusing the Cascade infrastructure) - for ( var me : persistenceContext.reentrantSafeEntityEntries() ) { - final var entry = me.getValue(); + for ( var entryEntry : persistenceContext.reentrantSafeEntityEntries() ) { + final var entry = entryEntry.getValue(); if ( checkable( entry ) ) { Cascade.cascade( CascadingActions.CHECK_ON_FLUSH, CascadePoint.BEFORE_FLUSH, session, entry.getPersister(), - me.getKey(), + entryEntry.getKey(), null ); } @@ -159,14 +159,14 @@ void checkForTransientReferences(EventSource session, PersistenceContext persist } private static boolean flushable(EntityEntry entry) { - final Status status = entry.getStatus(); + final var status = entry.getStatus(); return status == Status.MANAGED || status == Status.SAVING || status == Status.READ_ONLY; // debatable, see HHH-19398 } private static boolean checkable(EntityEntry entry) { - final Status status = entry.getStatus(); + final var status = entry.getStatus(); return status == Status.MANAGED || status == Status.SAVING; } @@ -228,7 +228,7 @@ private int flushEntities(final FlushEvent event, final PersistenceContext persi for ( var me : entityEntries ) { // Update the status of the object and if necessary, schedule an update final var entry = me.getValue(); - final Status status = entry.getStatus(); + final var status = entry.getStatus(); if ( status != Status.LOADING && status != Status.GONE ) { entityEvent = createOrReuseEventInstance( entityEvent, source, me.getKey(), entry ); entityEvent.setInstanceGenerationId( ++eventGenerationId ); @@ -270,22 +270,7 @@ private int flushCollections(final EventSource session, final PersistenceContext throws HibernateException { LOG.trace( "Processing unreferenced collections" ); final var collectionEntries = persistenceContext.getCollectionEntries(); - final int count; - if ( collectionEntries == null ) { - count = 0; - } - else { - count = collectionEntries.size(); - final var identityMap = - (InstanceIdentityMap, CollectionEntry>) - collectionEntries; - for ( var me : identityMap.toArray() ) { - final var ce = me.getValue(); - if ( !ce.isReached() && !ce.isIgnore() ) { - processUnreachableCollection( me.getKey(), session ); - } - } - } + final int count = processUnreachableCollections( session, collectionEntries ); // Schedule updates to collections: @@ -293,51 +278,54 @@ private int flushCollections(final EventSource session, final PersistenceContext final var actionQueue = session.getActionQueue(); final var interceptor = session.getInterceptor(); persistenceContext.forEachCollectionEntry( - (coll, ce) -> { - if ( ce.isDorecreate() ) { - interceptor.onCollectionRecreate( coll, ce.getCurrentKey() ); + (collection, collectionEntry) -> { + if ( collectionEntry.isDorecreate() ) { + final var currentKey = collectionEntry.getCurrentKey(); + interceptor.onCollectionRecreate( collection, currentKey ); actionQueue.addAction( new CollectionRecreateAction( - coll, - ce.getCurrentPersister(), - ce.getCurrentKey(), + collection, + collectionEntry.getCurrentPersister(), + currentKey, session ) ); } - if ( ce.isDoremove() ) { - interceptor.onCollectionRemove( coll, ce.getLoadedKey() ); - if ( !skipRemoval( session, ce.getLoadedPersister(), ce.getLoadedKey() ) ) { + if ( collectionEntry.isDoremove() ) { + final var loadedKey = collectionEntry.getLoadedKey(); + interceptor.onCollectionRemove( collection, loadedKey ); + if ( !skipRemoval( session, collectionEntry.getLoadedPersister(), loadedKey ) ) { actionQueue.addAction( new CollectionRemoveAction( - coll, - ce.getLoadedPersister(), - ce.getLoadedKey(), - ce.isSnapshotEmpty( coll ), + collection, + collectionEntry.getLoadedPersister(), + loadedKey, + collectionEntry.isSnapshotEmpty( collection ), session ) ); } } - if ( ce.isDoupdate() ) { - interceptor.onCollectionUpdate( coll, ce.getLoadedKey() ); + if ( collectionEntry.isDoupdate() ) { + final var loadedKey = collectionEntry.getLoadedKey(); + interceptor.onCollectionUpdate( collection, loadedKey ); actionQueue.addAction( new CollectionUpdateAction( - coll, - ce.getLoadedPersister(), - ce.getLoadedKey(), - ce.isSnapshotEmpty( coll ), + collection, + collectionEntry.getLoadedPersister(), + loadedKey, + collectionEntry.isSnapshotEmpty( collection ), session ) ); } // todo : I'm not sure the !wasInitialized part should really be part of this check - if ( !coll.wasInitialized() && coll.hasQueuedOperations() ) { + if ( !collection.wasInitialized() && collection.hasQueuedOperations() ) { actionQueue.addAction( new QueuedOperationCollectionAction( - coll, - ce.getLoadedPersister(), - ce.getLoadedKey(), + collection, + collectionEntry.getLoadedPersister(), + collectionEntry.getLoadedKey(), session ) ); @@ -349,6 +337,27 @@ private int flushCollections(final EventSource session, final PersistenceContext return count; } + private static int processUnreachableCollections( + EventSource session, + Map, CollectionEntry> collectionEntries) { + if ( collectionEntries == null ) { + return 0; + } + else { + final int count = collectionEntries.size(); + final var identityMap = + (InstanceIdentityMap, CollectionEntry>) + collectionEntries; + for ( var entry : identityMap.toArray() ) { + final var collectionEntry = entry.getValue(); + if ( !collectionEntry.isReached() && !collectionEntry.isIgnore() ) { + processUnreachableCollection( entry.getKey(), session ); + } + } + return count; + } + } + /** * Execute all SQL (and second-level cache updates) in a special order so that foreign-key constraints cannot * be violated:
    @@ -375,7 +384,7 @@ protected void performExecutions(EventSource session) { persistenceContext.setFlushing( true ); // we need to lock the collection caches before executing entity inserts/updates // in order to account for bidirectional associations - final ActionQueue actionQueue = session.getActionQueue(); + final var actionQueue = session.getActionQueue(); actionQueue.prepareActions(); actionQueue.executeActions(); } @@ -410,26 +419,27 @@ protected void postFlush(SessionImplementor session) throws HibernateException { persistenceContext.forEachCollectionEntry( (persistentCollection, collectionEntry) -> { collectionEntry.postFlush( persistentCollection ); - final Object key; - if ( collectionEntry.getLoadedPersister() == null || ( key = collectionEntry.getLoadedKey() ) == null ) { + final var loadedPersister = collectionEntry.getLoadedPersister(); + final Object key = collectionEntry.getLoadedKey(); + if ( loadedPersister != null && key != null ) { + //otherwise recreate the mapping between the collection and its key + final var collectionKey = new CollectionKey( loadedPersister, key ); + persistenceContext.addCollectionByKey( collectionKey, persistentCollection ); + } + else { //if the collection is dereferenced, unset its session reference and remove from the session cache //iter.remove(); //does not work, since the entrySet is not backed by the set persistentCollection.unsetSession( session ); persistenceContext.removeCollectionEntry( persistentCollection ); } - else { - //otherwise recreate the mapping between the collection and its key - final CollectionKey collectionKey = - new CollectionKey( collectionEntry.getLoadedPersister(), key ); - persistenceContext.addCollectionByKey( collectionKey, persistentCollection ); - } }, true ); } protected void postPostFlush(SessionImplementor session) { - session.getInterceptor().postFlush( session.getPersistenceContextInternal().managedEntitiesIterator() ); + session.getInterceptor() + .postFlush( session.getPersistenceContextInternal().managedEntitiesIterator() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractSaveEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractSaveEventListener.java index b4275c8c9220..4edfb0155c30 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractSaveEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractSaveEventListener.java @@ -27,7 +27,6 @@ import org.hibernate.jpa.event.spi.CallbackRegistry; import org.hibernate.jpa.event.spi.CallbackRegistryConsumer; import org.hibernate.persister.entity.EntityPersister; -import org.hibernate.generator.Generator; import org.hibernate.generator.BeforeExecutionGenerator; import org.hibernate.type.Type; import org.hibernate.type.TypeHelper; @@ -74,7 +73,7 @@ protected Object saveWithRequestedId( String entityName, C context, EventSource source) { - final EntityPersister persister = source.getEntityPersister( entityName, entity ); + final var persister = source.getEntityPersister( entityName, entity ); return performSave( entity, requestedId, persister, false, context, source, false ); } @@ -199,9 +198,9 @@ protected Object performSave( callbackRegistry.preCreate( entity ); processIfSelfDirtinessTracker( entity, SelfDirtinessTracker::$$_hibernate_clearDirtyAttributes ); - processIfManagedEntity( entity, (managedEntity) -> managedEntity.$$_hibernate_setUseTracker( true ) ); + processIfManagedEntity( entity, managedEntity -> managedEntity.$$_hibernate_setUseTracker( true ) ); - final Generator generator = persister.getGenerator(); + final var generator = persister.getGenerator(); if ( !generator.generatesOnInsert() || generator instanceof CompositeNestedGeneratedValueGenerator ) { id = persister.getIdentifier( entity, source ); if ( id == null ) { diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultDeleteEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultDeleteEventListener.java index a1b02adf9493..1ebae93176fa 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultDeleteEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultDeleteEventListener.java @@ -40,6 +40,7 @@ import org.hibernate.type.Type; import org.hibernate.type.TypeHelper; +import static java.util.Arrays.fill; import static org.hibernate.engine.internal.Collections.skipRemoval; import static org.hibernate.pretty.MessageHelper.infoString; import static org.hibernate.proxy.HibernateProxy.extractLazyInitializer; @@ -372,7 +373,6 @@ protected final void deleteEntity( LOG.trace( "Deleting " + infoString( persister, entityEntry.getId(), session.getFactory() ) ); } - final var persistenceContext = session.getPersistenceContextInternal(); final Object version = entityEntry.getVersion(); final Object[] currentState = @@ -391,6 +391,8 @@ protected final void deleteEntity( persister.getPropertyTypes() ); + final var persistenceContext = session.getPersistenceContextInternal(); + // before any callbacks, etc., so subdeletions see that this deletion happened first persistenceContext.setEntryStatus( entityEntry, Status.DELETED ); final var key = session.generateEntityKey( entityEntry.getId(), persister ); @@ -452,7 +454,7 @@ private Object[] createDeletedState( final Object[] deletedState = new Object[types.length]; if ( !persister.hasCollections() || !persister.hasUninitializedLazyProperties( parent ) ) { final boolean[] copyability = new boolean[types.length]; - java.util.Arrays.fill( copyability, true ); + fill( copyability, true ); TypeHelper.deepCopy( currentState, types, copyability, deletedState, eventSource ); return deletedState; } diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultFlushEntityEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultFlushEntityEventListener.java index b14c2c2a31d3..843d5aad2eb4 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultFlushEntityEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultFlushEntityEventListener.java @@ -72,8 +72,8 @@ public void checkId(Object object, EntityPersister persister, EntityEntry entry, } if ( !(entryId instanceof DelayedPostInsertIdentifier) ) { final Object currentId = persister.getIdentifier( object, session ); - // Small optimisation: always try to avoid getIdentifierType().isEqual(..) when possible. - // (However it's not safe to invoke the equals() method as it might trigger side effects.) + // Small optimization: always try to avoid getIdentifierType().isEqual(..) when possible. + // (However, it's not safe to invoke the equals() method as it might trigger side effects.) if ( entryId != currentId && !entry.getStatus().isDeletedOrGone() && !persister.getIdentifierType().isEqual( entryId, currentId, session.getFactory() ) ) { diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultFlushEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultFlushEventListener.java index fd0ec75353cd..9af348b02817 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultFlushEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultFlushEventListener.java @@ -27,16 +27,16 @@ public void onFlush(FlushEvent event) throws HibernateException { if ( persistenceContext.getNumberOfManagedEntities() > 0 || persistenceContext.getCollectionEntriesSize() > 0 ) { final var flushEvent = eventMonitor.beginFlushEvent(); + final var eventListenerManager = source.getEventListenerManager(); try { - source.getEventListenerManager().flushStart(); - + eventListenerManager.flushStart(); flushEverythingToExecutions( event ); performExecutions( source ); postFlush( source ); } finally { eventMonitor.completeFlushEvent( flushEvent, event ); - source.getEventListenerManager().flushEnd( + eventListenerManager.flushEnd( event.getNumberOfEntitiesProcessed(), event.getNumberOfCollectionsProcessed() ); diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultMergeEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultMergeEventListener.java index ff3a3e60ebb3..592b0afe9784 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultMergeEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultMergeEventListener.java @@ -139,7 +139,7 @@ private void doMerge(MergeEvent event, MergeContext copiedAlready, Object entity } private void merge(MergeEvent event, MergeContext copiedAlready, Object entity) { - final EventSource source = event.getSession(); + final var source = event.getSession(); // Check the persistence context for an entry relating to this // entity to be merged... final String entityName = event.getEntityName(); @@ -594,8 +594,8 @@ private static boolean existsInDatabase(Object entity, EventSource source, Entit if ( entry == null ) { final Object id = persister.getIdentifier( entity, source ); if ( id != null ) { - final EntityKey key = source.generateEntityKey( id, persister ); - final Object managedEntity = persistenceContext.getEntity( key ); + final var entityKey = source.generateEntityKey( id, persister ); + final Object managedEntity = persistenceContext.getEntity( entityKey ); entry = persistenceContext.getEntry( managedEntity ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultRefreshEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultRefreshEventListener.java index 25fa264143e1..a6fbb2eb04b1 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultRefreshEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultRefreshEventListener.java @@ -6,7 +6,6 @@ import org.hibernate.HibernateException; import org.hibernate.LockMode; -import org.hibernate.LockOptions; import org.hibernate.NonUniqueObjectException; import org.hibernate.TransientObjectException; import org.hibernate.UnresolvableObjectException; @@ -244,7 +243,7 @@ private static Object doRefresh( Object id, PersistenceContext persistenceContext) { // Handle the requested lock-mode (if one) in relation to the entry's (if one) current lock-mode - LockOptions lockOptionsToUse = event.getLockOptions(); + var lockOptionsToUse = event.getLockOptions(); final LockMode requestedLockMode = lockOptionsToUse.getLockMode(); final LockMode postRefreshLockMode; if ( entry != null ) { @@ -289,7 +288,6 @@ private static Object doRefresh( // - however, the refresh operation actually creates a new entry, so get it persistenceContext.getEntry( result ).setLockMode( postRefreshLockMode ); } - source.setReadOnly( result, isReadOnly( entry, persister, lazyInitializer, source ) ); } return result; @@ -337,7 +335,7 @@ private static void evictCachedCollections(Type[] types, Object id, EventSource factory, source.getTenantIdentifier() ); - final SoftLock lock = cache.lockItem( source, cacheKey, null ); + final var lock = cache.lockItem( source, cacheKey, null ); cache.remove( source, cacheKey ); actionQueue.registerProcess( (success, session) -> cache.unlockItem( session, cacheKey, lock ) ); } diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DirtyCollectionSearchVisitor.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DirtyCollectionSearchVisitor.java index 2fc85ce48919..16271c6656c6 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DirtyCollectionSearchVisitor.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DirtyCollectionSearchVisitor.java @@ -31,17 +31,13 @@ public class DirtyCollectionSearchVisitor extends AbstractVisitor { public DirtyCollectionSearchVisitor(Object entity, EventSource session, boolean[] propertyVersionability) { super( session ); - final EnhancementAsProxyLazinessInterceptor interceptor; - if ( isPersistentAttributeInterceptable( entity ) - && asPersistentAttributeInterceptable( entity ).$$_hibernate_getInterceptor() - instanceof EnhancementAsProxyLazinessInterceptor lazinessInterceptor ) { - interceptor = lazinessInterceptor; - } - else { - interceptor = null; - } - this.interceptor = interceptor; this.propertyVersionability = propertyVersionability; + this.interceptor = + isPersistentAttributeInterceptable( entity ) + && asPersistentAttributeInterceptable( entity ).$$_hibernate_getInterceptor() + instanceof EnhancementAsProxyLazinessInterceptor lazinessInterceptor + ? lazinessInterceptor + : null; } public boolean wasDirtyCollectionFound() { diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyNotAllowedObserver.java b/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyNotAllowedObserver.java index bd6678e66ecf..570c3591e605 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyNotAllowedObserver.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyNotAllowedObserver.java @@ -8,7 +8,8 @@ import org.hibernate.event.spi.EntityCopyObserver; import org.hibernate.event.spi.EntityCopyObserverFactory; import org.hibernate.event.spi.EventSource; -import org.hibernate.pretty.MessageHelper; + +import static org.hibernate.pretty.MessageHelper.infoString; /** * @author Gail Badner @@ -33,10 +34,9 @@ public void entityCopyDetected( if ( mergeEntity1 == managedEntity && mergeEntity2 == managedEntity) { throw new AssertionFailure( "entity1 and entity2 are the same as managedEntity; must be different." ); } - final String managedEntityString = MessageHelper.infoString( - session.getEntityName( managedEntity ), - session.getIdentifier( managedEntity ) - ); + final String managedEntityString = + infoString( session.getEntityName( managedEntity ), + session.getIdentifier( managedEntity ) ); throw new IllegalStateException( "Multiple representations of the same entity " + managedEntityString + " are being merged. " + getManagedOrDetachedEntityString( managedEntity, mergeEntity1 ) + "; " + diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyObserverFactoryInitiator.java b/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyObserverFactoryInitiator.java index 74c102e0d844..74b5efc26b33 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyObserverFactoryInitiator.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyObserverFactoryInitiator.java @@ -60,10 +60,10 @@ else if ( value.equals( EntityCopyAllowedLoggedObserver.SHORT_NAME ) // this might look excessive, but it also happens to test eagerly // (at boot) that we can actually construct these and that they // are indeed of the right type. - final EntityCopyObserver exampleInstance = + final var exampleInstance = registry.requireService( StrategySelector.class ) .resolveStrategy( EntityCopyObserver.class, value ); - final Class observerType = exampleInstance.getClass(); + final var observerType = exampleInstance.getClass(); LOG.tracef( "Configured EntityCopyObserver is a custom implementation of type '%s'", observerType.getName() ); return new EntityCopyObserverFactoryFromClass( observerType ); diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/EntityState.java b/hibernate-core/src/main/java/org/hibernate/event/internal/EntityState.java index 1f8eb2103063..2373195b9390 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/EntityState.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/EntityState.java @@ -36,7 +36,6 @@ public static EntityState getEntityState( Boolean assumedUnsaved) { if ( entry != null ) { // the object is persistent - //the entity is associated with the session, so check its status if ( entry.getStatus() != Status.DELETED ) { // do nothing for persistent instances diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/FlushVisitor.java b/hibernate-core/src/main/java/org/hibernate/event/internal/FlushVisitor.java index 09c9d73fe85b..bfeb3bc2e357 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/FlushVisitor.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/FlushVisitor.java @@ -28,28 +28,26 @@ public FlushVisitor(EventSource session, Object owner) { } Object processCollection(Object collection, CollectionType type) throws HibernateException { - if ( collection == CollectionType.UNFETCHED_COLLECTION ) { - return null; - } - else if ( collection != null ) { + if ( collection != null && collection != CollectionType.UNFETCHED_COLLECTION ) { final var session = getSession(); - final PersistentCollection persistentCollection; - if ( type.hasHolder() ) { - persistentCollection = session.getPersistenceContextInternal().getCollectionHolder( collection ); - } - else if ( collection == LazyPropertyInitializer.UNFETCHED_PROPERTY ) { - final Object keyOfOwner = type.getKeyOfOwner( owner, session ); - persistentCollection = (PersistentCollection) - type.getCollection( keyOfOwner, session, owner, Boolean.FALSE ); + final var persistentCollection = persistentCollection( collection, type, session ); + if ( persistentCollection != null ) { + processReachableCollection( persistentCollection, type, owner, session ); } - else if ( collection instanceof PersistentCollection wrapper ) { - persistentCollection = wrapper; - } - else { - return null; - } - processReachableCollection( persistentCollection, type, owner, session ); - return null; + } + return null; + } + + private PersistentCollection persistentCollection(Object collection, CollectionType type, EventSource session) { + if ( type.hasHolder() ) { + return session.getPersistenceContextInternal().getCollectionHolder( collection ); + } + else if ( collection == LazyPropertyInitializer.UNFETCHED_PROPERTY ) { + final Object keyOfOwner = type.getKeyOfOwner( owner, session ); + return (PersistentCollection) type.getCollection( keyOfOwner, session, owner, Boolean.FALSE ); + } + else if ( collection instanceof PersistentCollection wrapper ) { + return wrapper; } else { return null; diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/OnLockVisitor.java b/hibernate-core/src/main/java/org/hibernate/event/internal/OnLockVisitor.java index b9a2eb71fcd4..e9ae9db88778 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/OnLockVisitor.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/OnLockVisitor.java @@ -41,26 +41,26 @@ public Object processCollection(Object collection, CollectionType type) throws H if ( isOwnerUnchanged( persister, extractCollectionKeyFromOwner( persister ), persistentCollection ) ) { // a "detached" collection that originally belonged to the same entity if ( persistentCollection.isDirty() ) { - throw new HibernateException( "re-associated object has dirty collection" ); + throw new HibernateException( "reassociated object has dirty collection" ); } reattachCollection( persistentCollection, type ); } else { // a "detached" collection that belonged to a different entity - throw new HibernateException( "re-associated object has dirty collection reference" ); + throw new HibernateException( "reassociated object has dirty collection reference" ); } } else { // a collection loaded in the current session - // can not possibly be the collection belonging + // cannot possibly be the collection belonging // to the entity passed to update() - throw new HibernateException( "re-associated object has dirty collection reference" ); + throw new HibernateException( "reassociated object has dirty collection reference" ); } } else { // brand new collection //TODO: or an array!! we can't lock objects with arrays now?? - throw new HibernateException( "re-associated object has dirty collection reference (or an array)" ); + throw new HibernateException( "reassociated object has dirty collection reference (or an array)" ); } return null; } diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/PostUpdateEventListenerStandardImpl.java b/hibernate-core/src/main/java/org/hibernate/event/internal/PostUpdateEventListenerStandardImpl.java index dd0d2bbbc233..dd952d90e866 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/PostUpdateEventListenerStandardImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/PostUpdateEventListenerStandardImpl.java @@ -32,7 +32,7 @@ public void onPostUpdate(PostUpdateEvent event) { private void handlePostUpdate(Object entity, EventSource source) { // mimic the preUpdate filter if ( source == null // it must be a StatelessSession - || source.getPersistenceContextInternal().getEntry(entity).getStatus() != Status.DELETED ) { + || source.getPersistenceContextInternal().getEntry( entity ).getStatus() != Status.DELETED ) { callbackRegistry.postUpdate(entity); } } diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/ReattachVisitor.java b/hibernate-core/src/main/java/org/hibernate/event/internal/ReattachVisitor.java index 019ba71701bd..9089e00a9205 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/ReattachVisitor.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/ReattachVisitor.java @@ -10,7 +10,6 @@ import org.hibernate.internal.CoreLogging; import org.hibernate.internal.CoreMessageLogger; import org.hibernate.persister.collection.CollectionPersister; -import org.hibernate.type.CollectionType; import org.hibernate.type.CompositeType; import org.hibernate.type.Type; @@ -63,7 +62,6 @@ Object processComponent(Object component, CompositeType componentType) throws Hi else { super.processComponent( component, componentType ); } - return null; } @@ -95,7 +93,7 @@ void removeCollection(CollectionPersister role, Object collectionKey, EventSourc * @return The value from the owner that identifies the grouping into the collection */ final Object extractCollectionKeyFromOwner(CollectionPersister role) { - final CollectionType collectionType = role.getCollectionType(); + final var collectionType = role.getCollectionType(); if ( collectionType.useLHSPrimaryKey() ) { return ownerIdentifier; } diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/WrapVisitor.java b/hibernate-core/src/main/java/org/hibernate/event/internal/WrapVisitor.java index d2f49d82baf5..8e21addc9d5d 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/WrapVisitor.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/WrapVisitor.java @@ -29,6 +29,7 @@ */ public class WrapVisitor extends ProxyVisitor { private static final CoreMessageLogger LOG = CoreLogging.messageLogger( WrapVisitor.class ); + protected Object entity; protected Object id; @@ -90,8 +91,7 @@ final Object processArrayOrNewCollection(Object collection, CollectionType colle if ( attributeInterceptor instanceof EnhancementAsProxyLazinessInterceptor ) { return null; } - else if ( attributeInterceptor != null ) { - final var lazyLoadingInterceptor = (LazyAttributeLoadingInterceptor) attributeInterceptor; + else if ( attributeInterceptor instanceof LazyAttributeLoadingInterceptor lazyLoadingInterceptor ) { if ( lazyLoadingInterceptor.isAttributeLoaded( persister.getAttributeMapping().getAttributeName() ) ) { final var entry = persistenceContext.getEntry( entity ); if ( entry.isExistsInDatabase() ) { @@ -140,7 +140,7 @@ protected Object processComponent(Object component, CompositeType componentType) final Type[] types = componentType.getSubtypes(); boolean substituteComponent = false; for ( int i = 0; i < types.length; i++ ) { - Object result = processValue( values[i], types[i] ); + final Object result = processValue( values[i], types[i] ); if ( result != null ) { values[i] = result; substituteComponent = true; diff --git a/hibernate-core/src/main/java/org/hibernate/event/service/internal/EventListenerGroupImpl.java b/hibernate-core/src/main/java/org/hibernate/event/service/internal/EventListenerGroupImpl.java index cece709b80d3..b4087db491d2 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/service/internal/EventListenerGroupImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/event/service/internal/EventListenerGroupImpl.java @@ -28,6 +28,7 @@ import org.jboss.logging.Logger; +import static java.lang.System.arraycopy; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static java.util.Collections.singleton; @@ -239,7 +240,7 @@ private void internalAppend(T listener) { listenersWrite = createListenerArrayForWrite( size + 1 ); // first copy the existing listeners - System.arraycopy( listenersRead, 0, listenersWrite, 0, size ); + arraycopy( listenersRead, 0, listenersWrite, 0, size ); // and then put the new one after them listenersWrite[size] = listener; @@ -279,7 +280,7 @@ private void internalPrepend(T listener) { listenersWrite[0] = listener; // and copy the rest after it - System.arraycopy( listenersRead, 0, listenersWrite, 1, size ); + arraycopy( listenersRead, 0, listenersWrite, 1, size ); } setListeners( listenersWrite ); } @@ -293,7 +294,7 @@ private void handleListenerAddition(T listener, Consumer additionHandler) { int size = listenersRead.length; final T[] listenersWrite = createListenerArrayForWrite( size ); - System.arraycopy( listenersRead, 0, listenersWrite, 0, size ); + arraycopy( listenersRead, 0, listenersWrite, 0, size ); final boolean traceEnabled = log.isTraceEnabled(); diff --git a/hibernate-core/src/main/java/org/hibernate/event/service/internal/EventListenerRegistryImpl.java b/hibernate-core/src/main/java/org/hibernate/event/service/internal/EventListenerRegistryImpl.java index f36a08a7b92f..f1c290ec07dc 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/service/internal/EventListenerRegistryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/event/service/internal/EventListenerRegistryImpl.java @@ -6,7 +6,6 @@ import java.lang.reflect.Array; import java.util.ArrayList; -import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; @@ -41,6 +40,7 @@ import org.hibernate.internal.build.AllowReflection; import org.hibernate.jpa.event.spi.CallbackRegistry; +import static java.util.Comparator.comparing; import static org.hibernate.event.spi.EventType.AUTO_FLUSH; import static org.hibernate.event.spi.EventType.CLEAR; import static org.hibernate.event.spi.EventType.DELETE; @@ -108,8 +108,7 @@ public EventListenerGroup getEventListenerGroup(EventType eventType) { @Override public void addDuplicationStrategy(DuplicationStrategy strategy) { - //noinspection rawtypes - for ( EventListenerGroup group : eventListeners ) { + for ( var group : eventListeners ) { if ( group != null ) { group.addDuplicationStrategy( strategy ); } @@ -126,7 +125,7 @@ public final void setListeners(EventType type, Class... list @AllowReflection // Possible array types are registered in org.hibernate.graalvm.internal.StaticClassLists.typesNeedingArrayCopy private T[] resolveListenerInstances(EventType type, Class... listenerClasses) { @SuppressWarnings("unchecked") - T[] listeners = (T[]) Array.newInstance( type.baseListenerInterface(), listenerClasses.length ); + final T[] listeners = (T[]) Array.newInstance( type.baseListenerInterface(), listenerClasses.length ); for ( int i = 0; i < listenerClasses.length; i++ ) { listeners[i] = resolveListenerInstance( listenerClasses[i] ); } @@ -135,12 +134,15 @@ private T[] resolveListenerInstances(EventType type, Class.. private T resolveListenerInstance(Class listenerClass) { @SuppressWarnings("unchecked") - T listenerInstance = (T) listenerClassToInstanceMap.get( listenerClass ); + final T listenerInstance = (T) listenerClassToInstanceMap.get( listenerClass ); if ( listenerInstance == null ) { - listenerInstance = instantiateListener( listenerClass ); - listenerClassToInstanceMap.put( listenerClass, listenerInstance ); + T newListenerInstance = instantiateListener( listenerClass ); + listenerClassToInstanceMap.put( listenerClass, newListenerInstance ); + return newListenerInstance; + } + else { + return listenerInstance; } - return listenerInstance; } private T instantiateListener(Class listenerClass) { @@ -159,7 +161,7 @@ private T instantiateListener(Class listenerClass) { @Override @SafeVarargs public final void setListeners(EventType type, T... listeners) { - final EventListenerGroup registeredListeners = getEventListenerGroup( type ); + final var registeredListeners = getEventListenerGroup( type ); registeredListeners.clear(); if ( listeners != null ) { for ( T listener : listeners ) { @@ -200,9 +202,8 @@ public static class Builder { private final CallbackRegistry callbackRegistry; private final boolean jpaBootstrap; - private final Map,EventListenerGroup> listenerGroupMap = new TreeMap<>( - Comparator.comparing( EventType::ordinal ) - ); + private final Map,EventListenerGroup> listenerGroupMap = + new TreeMap<>( comparing( EventType::ordinal ) ); public Builder(CallbackRegistry callbackRegistry, boolean jpaBootstrap) { this.callbackRegistry = callbackRegistry; @@ -322,29 +323,22 @@ public void prepareListeners(EventType type, T defaultListener) { prepareListeners( type, defaultListener, - t -> { - if ( type == EventType.POST_COMMIT_DELETE - || type == EventType.POST_COMMIT_INSERT - || type == EventType.POST_COMMIT_UPDATE ) { - return new PostCommitEventListenerGroupImpl<>( type, callbackRegistry, jpaBootstrap ); - } - else { - return new EventListenerGroupImpl<>( type, callbackRegistry, jpaBootstrap ); - } - } + t -> type == EventType.POST_COMMIT_DELETE + || type == EventType.POST_COMMIT_INSERT + || type == EventType.POST_COMMIT_UPDATE + ? new PostCommitEventListenerGroupImpl<>( type, callbackRegistry, jpaBootstrap ) + : new EventListenerGroupImpl<>( type, callbackRegistry, jpaBootstrap ) ); } - public void prepareListeners( + void prepareListeners( EventType type, T defaultListener, Function,EventListenerGroupImpl> groupCreator) { - final EventListenerGroupImpl listenerGroup = groupCreator.apply( type ); - + final var listenerGroup = groupCreator.apply( type ); if ( defaultListener != null ) { listenerGroup.appendListener( defaultListener ); } - listenerGroupMap.put( type, listenerGroup ); } @@ -355,24 +349,19 @@ public EventListenerGroup getListenerGroup(EventType eventType) { public EventListenerRegistry buildRegistry(Map> registeredEventTypes) { // validate contiguity of the event-type ordinals and build the EventListenerGroups array - - final ArrayList> eventTypeList = new ArrayList<>( registeredEventTypes.values() ); - eventTypeList.sort( Comparator.comparing( EventType::ordinal ) ); - - final EventListenerGroup[] eventListeners = new EventListenerGroup[ eventTypeList.size() ]; - + final ArrayList> eventTypeList = + new ArrayList<>( registeredEventTypes.values() ); + eventTypeList.sort( comparing( EventType::ordinal ) ); + final EventListenerGroup[] eventListeners = + new EventListenerGroup[ eventTypeList.size() ]; int previous = -1; for ( int i = 0; i < eventTypeList.size(); i++ ) { - final EventType eventType = eventTypeList.get( i ); - + final var eventType = eventTypeList.get( i ); assert i == eventType.ordinal(); assert i - 1 == previous; - eventListeners[i] = listenerGroupMap.get( eventType ); - previous = i; } - return new EventListenerRegistryImpl( eventListeners ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/event/service/internal/PostCommitEventListenerGroupImpl.java b/hibernate-core/src/main/java/org/hibernate/event/service/internal/PostCommitEventListenerGroupImpl.java index 2e47f0f8d559..c045cff959ab 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/service/internal/PostCommitEventListenerGroupImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/event/service/internal/PostCommitEventListenerGroupImpl.java @@ -24,7 +24,7 @@ class PostCommitEventListenerGroupImpl extends EventListenerGroupImpl { private static final CoreMessageLogger log = CoreLogging.messageLogger( PostCommitEventListenerGroupImpl.class ); - private final Class extendedListenerContract; + private final Class extendedListenerContract; public PostCommitEventListenerGroupImpl( EventType eventType, @@ -33,13 +33,13 @@ public PostCommitEventListenerGroupImpl( super( eventType, callbackRegistry, isJpaBootstrap ); if ( eventType == EventType.POST_COMMIT_DELETE ) { - this.extendedListenerContract = PostCommitDeleteEventListener.class; + extendedListenerContract = PostCommitDeleteEventListener.class; } else if ( eventType == EventType.POST_COMMIT_INSERT ) { - this.extendedListenerContract = PostCommitInsertEventListener.class; + extendedListenerContract = PostCommitInsertEventListener.class; } else if ( eventType == EventType.POST_COMMIT_UPDATE ) { - this.extendedListenerContract = PostCommitUpdateEventListener.class; + extendedListenerContract = PostCommitUpdateEventListener.class; } else { throw new IllegalStateException( "Unexpected usage of PostCommitEventListenerGroupImpl" ); diff --git a/hibernate-core/src/main/java/org/hibernate/event/service/spi/EventListenerGroups.java b/hibernate-core/src/main/java/org/hibernate/event/service/spi/EventListenerGroups.java index 47ce3f93ff1d..9166fc7e7d5c 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/service/spi/EventListenerGroups.java +++ b/hibernate-core/src/main/java/org/hibernate/event/service/spi/EventListenerGroups.java @@ -96,8 +96,7 @@ private static EventListenerGroup listeners(EventListenerRegistry listene public EventListenerGroups(ServiceRegistry serviceRegistry) { Objects.requireNonNull( serviceRegistry ); - final EventListenerRegistry eventListenerRegistry = - serviceRegistry.requireService( EventListenerRegistry.class ); + final var eventListenerRegistry = serviceRegistry.requireService( EventListenerRegistry.class ); // Pre-compute all iterators on Event listeners: diff --git a/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java index 3faef763f214..50c11bb96d05 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java @@ -22,7 +22,6 @@ import org.hibernate.action.spi.AfterTransactionCompletionProcess; import org.hibernate.bytecode.enhance.spi.interceptor.EnhancementAsProxyLazinessInterceptor; import org.hibernate.cache.CacheException; -import org.hibernate.cache.spi.access.SoftLock; import org.hibernate.collection.spi.CollectionSemantics; import org.hibernate.collection.spi.PersistentCollection; import org.hibernate.engine.spi.EntityKey; @@ -1367,7 +1366,7 @@ protected Object lockCacheItem(Object id, Object previousVersion, EntityPersiste getFactory(), getTenantIdentifier() ); - final SoftLock lock = cache.lockItem( this, cacheKey, previousVersion ); + final var lock = cache.lockItem( this, cacheKey, previousVersion ); afterCompletions.add( (success, session) -> cache.unlockItem( session, cacheKey, lock ) ); return cacheKey; } @@ -1391,7 +1390,7 @@ protected Object lockCacheItem(Object key, CollectionPersister persister) { getFactory(), getTenantIdentifier() ); - final SoftLock lock = cache.lockItem( this, cacheKey, null ); + final var lock = cache.lockItem( this, cacheKey, null ); afterCompletions.add( (success, session) -> cache.unlockItem( this, cacheKey, lock ) ); return cacheKey; } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyPojoStandard.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyPojoStandard.java index 29cab619027d..b91e55e2d5cb 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyPojoStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyPojoStandard.java @@ -35,10 +35,10 @@ import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.spi.CompositeTypeImplementor; +import static java.lang.reflect.Modifier.isFinal; import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptableType; import static org.hibernate.internal.util.ReflectHelper.getMethod; import static org.hibernate.metamodel.internal.PropertyAccessHelper.propertyAccessStrategy; -import static org.hibernate.proxy.pojo.ProxyFactoryHelper.validateGetterSetterMethodProxyability; /** * @author Steve Ebersole @@ -375,4 +375,17 @@ else if ( mapsIdRepresentationStrategy != null ) { } } } + + private static void validateGetterSetterMethodProxyability(String getterOrSetter, Method method ) { + if ( method != null && isFinal( method.getModifiers() ) ) { + throw new HibernateException( + String.format( + "%s methods of lazy classes cannot be final: %s#%s", + getterOrSetter, + method.getDeclaringClass().getName(), + method.getName() + ) + ); + } + } } diff --git a/hibernate-core/src/main/java/org/hibernate/property/access/internal/AbstractFieldSerialForm.java b/hibernate-core/src/main/java/org/hibernate/property/access/internal/AbstractFieldSerialForm.java index b574b0d4ede8..38c92906ee0a 100644 --- a/hibernate-core/src/main/java/org/hibernate/property/access/internal/AbstractFieldSerialForm.java +++ b/hibernate-core/src/main/java/org/hibernate/property/access/internal/AbstractFieldSerialForm.java @@ -30,7 +30,7 @@ protected AbstractFieldSerialForm(Class declaringClass, String fieldName) { protected Field resolveField() { try { - final Field field = declaringClass.getDeclaredField( fieldName ); + final var field = declaringClass.getDeclaredField( fieldName ); ReflectHelper.ensureAccessibility( field ); return field; } diff --git a/hibernate-core/src/main/java/org/hibernate/property/access/internal/AbstractSetterMethodSerialForm.java b/hibernate-core/src/main/java/org/hibernate/property/access/internal/AbstractSetterMethodSerialForm.java index b8883f32b135..5da77096a068 100644 --- a/hibernate-core/src/main/java/org/hibernate/property/access/internal/AbstractSetterMethodSerialForm.java +++ b/hibernate-core/src/main/java/org/hibernate/property/access/internal/AbstractSetterMethodSerialForm.java @@ -53,7 +53,7 @@ public Class getArgumentType() { protected Method resolveMethod() { try { - final Method method = declaringClass.getDeclaredMethod( methodName, argumentType ); + final var method = declaringClass.getDeclaredMethod( methodName, argumentType ); ReflectHelper.ensureAccessibility( method ); return method; } diff --git a/hibernate-core/src/main/java/org/hibernate/property/access/internal/AccessStrategyHelper.java b/hibernate-core/src/main/java/org/hibernate/property/access/internal/AccessStrategyHelper.java index dbb151d3d2b3..20770b0398e6 100644 --- a/hibernate-core/src/main/java/org/hibernate/property/access/internal/AccessStrategyHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/property/access/internal/AccessStrategyHelper.java @@ -6,8 +6,6 @@ import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; import org.hibernate.PropertyNotFoundException; import org.hibernate.bytecode.enhance.spi.interceptor.BytecodeLazyAttributeInterceptor; @@ -20,6 +18,7 @@ import jakarta.persistence.Transient; import org.checkerframework.checker.nullness.qual.Nullable; +import static java.lang.reflect.Modifier.isStatic; import static org.hibernate.engine.internal.ManagedTypeHelper.asCompositeOwner; import static org.hibernate.engine.internal.ManagedTypeHelper.asCompositeTracker; import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable; @@ -48,14 +47,14 @@ public class AccessStrategyHelper { } public static AccessType getAccessType(Class containerJavaType, String propertyName) { - final Field field = fieldOrNull( containerJavaType, propertyName ); - final AccessType explicitAccessType = getExplicitAccessType( containerJavaType, propertyName, field ); + final var field = fieldOrNull( containerJavaType, propertyName ); + final var explicitAccessType = getExplicitAccessType( containerJavaType, propertyName, field ); if ( explicitAccessType != null ) { return explicitAccessType; } // No @Access on property or field; check to see if containerJavaType has an explicit @Access - AccessType classAccessType = getAccessTypeOrNull( containerJavaType ); + final var classAccessType = getAccessTypeOrNull( containerJavaType ); if ( classAccessType != null ) { return classAccessType; } @@ -78,38 +77,37 @@ public static AccessType getAccessType(Class containerJavaType, String proper if ( field != null && field.isAnnotationPresent( Access.class ) && !field.isAnnotationPresent( Transient.class ) - && !Modifier.isStatic( field.getModifiers() ) ) { + && !isStatic( field.getModifiers() ) ) { return AccessType.FIELD; } - final Method getter = getterMethodOrNull( containerClass, propertyName ); - if ( getter != null && getter.isAnnotationPresent( Access.class ) ) { - return AccessType.PROPERTY; - } - - return null; + final var getter = getterMethodOrNull( containerClass, propertyName ); + return getter != null && getter.isAnnotationPresent( Access.class ) + ? AccessType.PROPERTY + : null; } protected static @Nullable AccessType getAccessTypeOrNull(@Nullable AnnotatedElement element) { if ( element == null ) { return null; } - Access elementAccess = element.getAnnotation( Access.class ); - return elementAccess == null ? null : elementAccess.value(); + else { + final var elementAccess = element.getAnnotation( Access.class ); + return elementAccess == null ? null : elementAccess.value(); + } } public static int determineEnhancementState(Class containerClass, Class attributeType) { - return ( CompositeOwner.class.isAssignableFrom( containerClass ) ? AccessStrategyHelper.COMPOSITE_OWNER : 0 ) - | ( CompositeTracker.class.isAssignableFrom( attributeType ) ? AccessStrategyHelper.COMPOSITE_TRACKER_MASK : 0 ) - | ( isPersistentAttributeInterceptableType( containerClass ) ? AccessStrategyHelper.PERSISTENT_ATTRIBUTE_INTERCEPTABLE_MASK : 0 ); + return ( CompositeOwner.class.isAssignableFrom( containerClass ) ? COMPOSITE_OWNER : 0 ) + | ( CompositeTracker.class.isAssignableFrom( attributeType ) ? COMPOSITE_TRACKER_MASK : 0 ) + | ( isPersistentAttributeInterceptableType( containerClass ) ? PERSISTENT_ATTRIBUTE_INTERCEPTABLE_MASK : 0 ); } public static void handleEnhancedInjection(Object target, @Nullable Object value, int enhancementState, String propertyName) { // This sets the component relation for dirty tracking purposes if ( ( enhancementState & COMPOSITE_OWNER ) != 0 - && ( ( enhancementState & COMPOSITE_TRACKER_MASK ) != 0 - && value != null - || isCompositeTracker( value ) ) ) { + && ( ( enhancementState & COMPOSITE_TRACKER_MASK ) != 0 && value != null + || isCompositeTracker( value ) ) ) { asCompositeTracker( NullnessUtil.castNonNull(value) ).$$_hibernate_setOwner( propertyName, asCompositeOwner( target ) ); } diff --git a/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessBasicImpl.java b/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessBasicImpl.java index 764bc3afa2dc..15f980ad5ef2 100644 --- a/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessBasicImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessBasicImpl.java @@ -4,9 +4,6 @@ */ package org.hibernate.property.access.internal; -import java.lang.reflect.Method; - -import org.hibernate.internal.util.ReflectHelper; import org.hibernate.property.access.spi.Getter; import org.hibernate.property.access.spi.GetterMethodImpl; import org.hibernate.property.access.spi.PropertyAccess; @@ -17,6 +14,10 @@ import org.checkerframework.checker.nullness.qual.Nullable; +import static org.hibernate.internal.util.ReflectHelper.findGetterMethod; +import static org.hibernate.internal.util.ReflectHelper.findSetterMethod; +import static org.hibernate.internal.util.ReflectHelper.setterMethodOrNull; + /** * {@link PropertyAccess} for accessing the wrapped property via get/set pair, which may be nonpublic. * @@ -37,12 +38,12 @@ public PropertyAccessBasicImpl( boolean setterRequired) { this.strategy = strategy; - final Method getterMethod = ReflectHelper.findGetterMethod( containerJavaType, propertyName ); + final var getterMethod = findGetterMethod( containerJavaType, propertyName ); getter = new GetterMethodImpl( containerJavaType, propertyName, getterMethod ); - final Method setterMethod = setterRequired - ? ReflectHelper.findSetterMethod( containerJavaType, propertyName, getterMethod.getReturnType() ) - : ReflectHelper.setterMethodOrNull( containerJavaType, propertyName, getterMethod.getReturnType() ); + final var setterMethod = setterRequired + ? findSetterMethod( containerJavaType, propertyName, getterMethod.getReturnType() ) + : setterMethodOrNull( containerJavaType, propertyName, getterMethod.getReturnType() ); setter = setterMethod != null ? new SetterMethodImpl( containerJavaType, propertyName, setterMethod ) : null; diff --git a/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessEnhancedImpl.java b/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessEnhancedImpl.java index d64713d79685..4e03ab76c25c 100644 --- a/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessEnhancedImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessEnhancedImpl.java @@ -17,13 +17,13 @@ import org.hibernate.property.access.spi.PropertyAccessStrategy; import org.hibernate.property.access.spi.Setter; -import java.lang.reflect.Field; import java.lang.reflect.Method; import static org.hibernate.internal.util.ReflectHelper.findField; import static org.hibernate.internal.util.ReflectHelper.findSetterMethod; import static org.hibernate.internal.util.ReflectHelper.getterMethodOrNull; import static org.hibernate.property.access.internal.AccessStrategyHelper.fieldOrNull; +import static org.hibernate.property.access.internal.AccessStrategyHelper.getAccessType; /** * A {@link PropertyAccess} for byte code enhanced entities. Enhanced setter methods ( if available ) are used for @@ -45,14 +45,14 @@ public PropertyAccessEnhancedImpl( @Nullable AccessType classAccessType) { this.strategy = strategy; - final AccessType propertyAccessType = + final var propertyAccessType = classAccessType == null - ? AccessStrategyHelper.getAccessType( containerJavaType, propertyName ) + ? getAccessType( containerJavaType, propertyName ) : classAccessType; switch ( propertyAccessType ) { case FIELD: { - final Field field = fieldOrNull( containerJavaType, propertyName ); + final var field = fieldOrNull( containerJavaType, propertyName ); if ( field == null ) { throw new PropertyAccessBuildingException( "Could not locate field for property named [" + containerJavaType.getName() + "#" + propertyName + "]" @@ -63,7 +63,7 @@ public PropertyAccessEnhancedImpl( break; } case PROPERTY: { - final Method getterMethod = getterMethodOrNull( containerJavaType, propertyName ); + final var getterMethod = getterMethodOrNull( containerJavaType, propertyName ); if ( getterMethod == null ) { throw new PropertyAccessBuildingException( "Could not locate getter for property named [" + containerJavaType.getName() + "#" + propertyName + "]" @@ -83,29 +83,31 @@ public PropertyAccessEnhancedImpl( private static Getter propertyGetter(@Nullable AccessType classAccessType, Class containerJavaType, String propertyName, Method getterMethod) { if ( classAccessType != null ) { - final AccessType explicitAccessType = AccessStrategyHelper.getAccessType( containerJavaType, propertyName ); + final var explicitAccessType = getAccessType( containerJavaType, propertyName ); if ( explicitAccessType == AccessType.FIELD ) { - // We need to default to FIELD unless we have an explicit AccessType to avoid unnecessary initializations - final Field field = findField( containerJavaType, propertyName ); - return new EnhancedGetterFieldImpl( containerJavaType, propertyName, field, getterMethod ); + // We need to default to FIELD unless we have an explicit AccessType + // to avoid unnecessary initializations + return new EnhancedGetterFieldImpl( containerJavaType, propertyName, + findField( containerJavaType, propertyName ), getterMethod ); } } - // when classAccessType is null know PROPERTY is the explicit access type + // when classAccessType is null, know PROPERTY is the explicit access type return new GetterMethodImpl( containerJavaType, propertyName, getterMethod ); } private static Setter propertySetter(@Nullable AccessType classAccessType, Class containerJavaType, String propertyName, Class fieldType) { if ( classAccessType != null ) { - final AccessType explicitAccessType = AccessStrategyHelper.getAccessType( containerJavaType, propertyName ); + final var explicitAccessType = getAccessType( containerJavaType, propertyName ); if ( explicitAccessType == AccessType.FIELD ) { - // We need to default to FIELD unless we have an explicit AccessType to avoid unnecessary initializations - final Field field = findField( containerJavaType, propertyName ); - return new EnhancedSetterImpl( containerJavaType, propertyName, field ); + // We need to default to FIELD unless we have an explicit AccessType + // to avoid unnecessary initializations + return new EnhancedSetterImpl( containerJavaType, propertyName, + findField( containerJavaType, propertyName ) ); } } - // when classAccessType is null know PROPERTY is the explicit access type - final Method setterMethod = findSetterMethod( containerJavaType, propertyName, fieldType ); - return new EnhancedSetterMethodImpl( containerJavaType, propertyName, setterMethod ); + // when classAccessType is null, know PROPERTY is the explicit access type + return new EnhancedSetterMethodImpl( containerJavaType, propertyName, + findSetterMethod( containerJavaType, propertyName, fieldType ) ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessFieldImpl.java b/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessFieldImpl.java index bed336646207..3367b060b682 100644 --- a/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessFieldImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessFieldImpl.java @@ -4,9 +4,7 @@ */ package org.hibernate.property.access.internal; -import java.lang.reflect.Field; -import org.hibernate.internal.util.ReflectHelper; import org.hibernate.property.access.spi.Getter; import org.hibernate.property.access.spi.GetterFieldImpl; import org.hibernate.property.access.spi.PropertyAccess; @@ -14,6 +12,8 @@ import org.hibernate.property.access.spi.Setter; import org.hibernate.property.access.spi.SetterFieldImpl; +import static org.hibernate.internal.util.ReflectHelper.findField; + /** * @author Steve Ebersole * @author Gavin King @@ -29,7 +29,7 @@ public PropertyAccessFieldImpl( final String propertyName) { this.strategy = strategy; - final Field field = ReflectHelper.findField( containerJavaType, propertyName ); + final var field = findField( containerJavaType, propertyName ); getter = new GetterFieldImpl( containerJavaType, propertyName, field ); setter = new SetterFieldImpl( containerJavaType, propertyName, field ); } diff --git a/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessGetterImpl.java b/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessGetterImpl.java index 2cc110a1fbab..e1abb3ed43a8 100644 --- a/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessGetterImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessGetterImpl.java @@ -4,7 +4,6 @@ */ package org.hibernate.property.access.internal; -import jakarta.persistence.AccessType; import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.property.access.spi.Getter; import org.hibernate.property.access.spi.GetterFieldImpl; @@ -18,6 +17,8 @@ import java.lang.reflect.Method; import static org.hibernate.internal.util.ReflectHelper.getterMethodOrNull; +import static org.hibernate.property.access.internal.AccessStrategyHelper.fieldOrNull; +import static org.hibernate.property.access.internal.AccessStrategyHelper.getAccessType; /** * A {@link PropertyAccess} based on mix of getter method or field. @@ -32,10 +33,10 @@ public class PropertyAccessGetterImpl implements PropertyAccess { public PropertyAccessGetterImpl(PropertyAccessStrategy strategy, Class containerJavaType, String propertyName) { this.strategy = strategy; - final AccessType propertyAccessType = AccessStrategyHelper.getAccessType( containerJavaType, propertyName ); + final var propertyAccessType = getAccessType( containerJavaType, propertyName ); switch ( propertyAccessType ) { case FIELD: { - final Field field = AccessStrategyHelper.fieldOrNull( containerJavaType, propertyName ); + final var field = fieldOrNull( containerJavaType, propertyName ); if ( field == null ) { throw new PropertyAccessBuildingException( "Could not locate field for property named [" + containerJavaType.getName() + "#" + propertyName + "]" @@ -45,7 +46,7 @@ public PropertyAccessGetterImpl(PropertyAccessStrategy strategy, Class contai break; } case PROPERTY: { - final Method getterMethod = getterMethodOrNull( containerJavaType, propertyName ); + final var getterMethod = getterMethodOrNull( containerJavaType, propertyName ); if ( getterMethod == null ) { throw new PropertyAccessBuildingException( "Could not locate getter for property named [" + containerJavaType.getName() + "#" + propertyName + "]" diff --git a/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessMixedImpl.java b/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessMixedImpl.java index f158ef6b015f..55a532ca9a53 100644 --- a/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessMixedImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/property/access/internal/PropertyAccessMixedImpl.java @@ -17,11 +17,12 @@ import org.hibernate.property.access.spi.SetterFieldImpl; import org.hibernate.property.access.spi.SetterMethodImpl; -import jakarta.persistence.AccessType; import org.checkerframework.checker.nullness.qual.PolyNull; import static org.hibernate.internal.util.ReflectHelper.findSetterMethod; import static org.hibernate.internal.util.ReflectHelper.getterMethodOrNull; +import static org.hibernate.property.access.internal.AccessStrategyHelper.fieldOrNull; +import static org.hibernate.property.access.internal.AccessStrategyHelper.getAccessType; /** * A {@link PropertyAccess} based on mix of getter/setter method and/or field. @@ -37,10 +38,10 @@ public class PropertyAccessMixedImpl implements PropertyAccess { public PropertyAccessMixedImpl(PropertyAccessStrategy strategy, Class containerJavaType, String propertyName) { this.strategy = strategy; - final AccessType propertyAccessType = AccessStrategyHelper.getAccessType( containerJavaType, propertyName ); + final var propertyAccessType = getAccessType( containerJavaType, propertyName ); switch ( propertyAccessType ) { case FIELD: { - final Field field = AccessStrategyHelper.fieldOrNull( containerJavaType, propertyName ); + final var field = fieldOrNull( containerJavaType, propertyName ); if ( field == null ) { throw new PropertyAccessBuildingException( "Could not locate field for property named [" + containerJavaType.getName() + "#" + propertyName + "]" @@ -51,13 +52,13 @@ public PropertyAccessMixedImpl(PropertyAccessStrategy strategy, Class contain break; } case PROPERTY: { - final Method getterMethod = getterMethodOrNull( containerJavaType, propertyName ); + final var getterMethod = getterMethodOrNull( containerJavaType, propertyName ); if ( getterMethod == null ) { throw new PropertyAccessBuildingException( "Could not locate getter for property named [" + containerJavaType.getName() + "#" + propertyName + "]" ); } - final Method setterMethod = findSetterMethod( containerJavaType, propertyName, getterMethod.getReturnType() ); + final var setterMethod = findSetterMethod( containerJavaType, propertyName, getterMethod.getReturnType() ); getter = propertyGetter( containerJavaType, propertyName, getterMethod ); setter = propertySetter( containerJavaType, propertyName, setterMethod ); diff --git a/hibernate-core/src/main/java/org/hibernate/property/access/spi/EnhancedSetterMethodImpl.java b/hibernate-core/src/main/java/org/hibernate/property/access/spi/EnhancedSetterMethodImpl.java index ca60fca711fb..d1eebbfea4dd 100644 --- a/hibernate-core/src/main/java/org/hibernate/property/access/spi/EnhancedSetterMethodImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/property/access/spi/EnhancedSetterMethodImpl.java @@ -38,7 +38,6 @@ public EnhancedSetterMethodImpl(Class containerClass, String propertyName, Me @Override public void set(Object target, @Nullable Object value) { super.set( target, value ); - handleEnhancedInjection( target, value, enhancementState, propertyName ); } diff --git a/hibernate-core/src/main/java/org/hibernate/property/access/spi/GetterMethodImpl.java b/hibernate-core/src/main/java/org/hibernate/property/access/spi/GetterMethodImpl.java index c60082ad9300..e8a2ad02ee3c 100644 --- a/hibernate-core/src/main/java/org/hibernate/property/access/spi/GetterMethodImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/property/access/spi/GetterMethodImpl.java @@ -47,7 +47,7 @@ public GetterMethodImpl(Class containerClass, String propertyName, Method get return getterMethod.invoke( owner, ArrayHelper.EMPTY_OBJECT_ARRAY ); } catch (InvocationTargetException ite) { - final Throwable cause = ite.getCause(); + final var cause = ite.getCause(); if ( cause instanceof Error error ) { // HHH-16403 Don't wrap Error throw error; @@ -138,7 +138,7 @@ private Object readResolve() { private Method resolveMethod() { try { - final Method method = declaringClass.getDeclaredMethod( methodName ); + final var method = declaringClass.getDeclaredMethod( methodName ); ReflectHelper.ensureAccessibility( method ); return method; } diff --git a/hibernate-core/src/main/java/org/hibernate/property/access/spi/SetterFieldImpl.java b/hibernate-core/src/main/java/org/hibernate/property/access/spi/SetterFieldImpl.java index 9c33bbdb6f6c..9fed5fc655fe 100644 --- a/hibernate-core/src/main/java/org/hibernate/property/access/spi/SetterFieldImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/property/access/spi/SetterFieldImpl.java @@ -13,12 +13,11 @@ import org.hibernate.Internal; import org.hibernate.PropertyAccessException; import org.hibernate.property.access.internal.AbstractFieldSerialForm; -import org.hibernate.proxy.HibernateProxy; -import org.hibernate.proxy.LazyInitializer; import org.checkerframework.checker.nullness.qual.Nullable; import static org.hibernate.internal.util.ReflectHelper.setterMethodOrNull; +import static org.hibernate.proxy.HibernateProxy.extractLazyInitializer; /** * Field-based implementation of Setter @@ -57,7 +56,7 @@ public void set(Object target, @Nullable Object value) { field.set( target, value ); } catch (Exception e) { - if (value == null && field.getType().isPrimitive()) { + if ( value == null && field.getType().isPrimitive() ) { throw new PropertyAccessException( e, String.format( @@ -72,23 +71,12 @@ public void set(Object target, @Nullable Object value) { ); } else { - final String valueType; - final LazyInitializer lazyInitializer = HibernateProxy.extractLazyInitializer( value ); - if ( lazyInitializer != null ) { - valueType = lazyInitializer.getEntityName(); - } - else if ( value != null ) { - valueType = value.getClass().getTypeName(); - } - else { - valueType = ""; - } throw new PropertyAccessException( e, String.format( Locale.ROOT, "Could not set value of type [%s]", - valueType + typeName( value ) ), true, containerClass, @@ -98,6 +86,19 @@ else if ( value != null ) { } } + private static String typeName(@Nullable Object value) { + final var lazyInitializer = extractLazyInitializer( value ); + if ( lazyInitializer != null ) { + return lazyInitializer.getEntityName(); + } + else if ( value != null ) { + return value.getClass().getTypeName(); + } + else { + return ""; + } + } + @Override public @Nullable String getMethodName() { return setterMethod != null ? setterMethod.getName() : null; diff --git a/hibernate-core/src/main/java/org/hibernate/property/access/spi/SetterMethodImpl.java b/hibernate-core/src/main/java/org/hibernate/property/access/spi/SetterMethodImpl.java index 52bdddf23405..6d4f90db8b7f 100644 --- a/hibernate-core/src/main/java/org/hibernate/property/access/spi/SetterMethodImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/property/access/spi/SetterMethodImpl.java @@ -36,7 +36,6 @@ public SetterMethodImpl(Class containerClass, String propertyName, Method set this.containerClass = containerClass; this.propertyName = propertyName; this.setterMethod = setterMethod; - this.isPrimitive = setterMethod.getParameterTypes()[0].isPrimitive(); } @@ -66,7 +65,7 @@ public void set(Object target, @Nullable Object value) { } } catch (InvocationTargetException ite) { - final Throwable cause = ite.getCause(); + final var cause = ite.getCause(); if ( cause instanceof Error error ) { // HHH-16403 Don't wrap Error throw error; @@ -100,7 +99,7 @@ public void set(Object target, @Nullable Object value) { ); } else { - final Class expectedType = setterMethod.getParameterTypes()[0]; + final var expectedType = setterMethod.getParameterTypes()[0]; LOG.illegalPropertySetterArgument( containerClass.getName(), propertyName ); LOG.expectedType( expectedType.getName(), value == null ? null : value.getClass().getName() ); throw new PropertySetterAccessException( diff --git a/hibernate-core/src/main/java/org/hibernate/proxy/AbstractLazyInitializer.java b/hibernate-core/src/main/java/org/hibernate/proxy/AbstractLazyInitializer.java index 5840a16f1384..3e1d9f00e090 100644 --- a/hibernate-core/src/main/java/org/hibernate/proxy/AbstractLazyInitializer.java +++ b/hibernate-core/src/main/java/org/hibernate/proxy/AbstractLazyInitializer.java @@ -10,9 +10,6 @@ import org.hibernate.SessionException; import org.hibernate.boot.spi.SessionFactoryOptions; import org.hibernate.engine.spi.EntityKey; -import org.hibernate.engine.spi.PersistenceContext; -import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.CoreLogging; import org.hibernate.internal.CoreMessageLogger; @@ -146,7 +143,7 @@ private static EntityKey generateEntityKeyOrNull(Object id, SharedSessionContrac return null; } else { - final EntityPersister entityDescriptor = + final var entityDescriptor = session.getFactory().getMappingMetamodel() .getEntityDescriptor( entityName ); return session.generateEntityKey( id, entityDescriptor ); @@ -205,9 +202,9 @@ protected void permissiveInitialization() { + entityName + "#" + id + "] - no session" ); } try { - final SessionFactoryImplementor factory = - SessionFactoryRegistry.INSTANCE.getSessionFactory( sessionFactoryUuid ); - final SessionImplementor session = factory.openSession(); + final var session = + SessionFactoryRegistry.INSTANCE.getSessionFactory( sessionFactoryUuid ) + .openSession(); session.getPersistenceContext().setDefaultReadOnly( true ); session.setHibernateFlushMode( FlushMode.MANUAL ); @@ -265,8 +262,8 @@ else if ( session.isOpenOrWaitingForAutoClose() && session.isConnected() ) { */ public final void initializeWithoutLoadIfPossible() { if ( !initialized && session != null && session.isOpenOrWaitingForAutoClose() ) { - final EntityPersister entityDescriptor = getMappingMetamodel().getEntityDescriptor( getEntityName() ); - final EntityKey key = session.generateEntityKey( getInternalIdentifier(), entityDescriptor ); + final var entityDescriptor = getMappingMetamodel().getEntityDescriptor( getEntityName() ); + final var key = session.generateEntityKey( getInternalIdentifier(), entityDescriptor ); final Object entity = session.getPersistenceContextInternal().getEntity( key ); if ( entity != null ) { setImplementation( entity ); @@ -314,7 +311,7 @@ protected final boolean isConnectedToSession() { } private Object getProxyOrNull() { - final EntityKey entityKey = generateEntityKeyOrNull( getInternalIdentifier(), session, getEntityName() ); + final var entityKey = generateEntityKeyOrNull( getInternalIdentifier(), session, getEntityName() ); if ( entityKey != null && session != null && session.isOpenOrWaitingForAutoClose() ) { return session.getPersistenceContextInternal().getProxy( entityKey ); } @@ -335,7 +332,7 @@ public final void setImplementation(Object target) { @Override public final Object getImplementation(SharedSessionContractImplementor session) throws HibernateException { - final EntityKey entityKey = generateEntityKeyOrNull( getInternalIdentifier(), session, getEntityName() ); + final var entityKey = generateEntityKeyOrNull( getInternalIdentifier(), session, getEntityName() ); return entityKey == null ? null : session.getPersistenceContext().getEntity( entityKey ); } @@ -394,16 +391,17 @@ public final void setReadOnly(boolean readOnly) { errorIfReadOnlySettingNotAvailable(); // only update if readOnly is different from current setting if ( this.readOnly != readOnly ) { - final EntityPersister entityDescriptor = getEntityDescriptor(); - if ( !entityDescriptor.isMutable() && !readOnly ) { + if ( !getEntityDescriptor().isMutable() && !readOnly ) { throw new IllegalStateException( "Cannot make proxy [" + entityName + "#" + id + "] for immutable entity modifiable" ); } this.readOnly = readOnly; if ( initialized ) { - EntityKey key = generateEntityKeyOrNull( getInternalIdentifier(), session, getEntityName() ); - final PersistenceContext persistenceContext = session.getPersistenceContext(); - if ( key != null && persistenceContext.containsEntity( key ) ) { - persistenceContext.setReadOnly( target, readOnly ); + final var key = generateEntityKeyOrNull( getInternalIdentifier(), session, getEntityName() ); + if ( key != null ) { + final var persistenceContext = session.getPersistenceContext(); + if ( persistenceContext.containsEntity( key ) ) { + persistenceContext.setReadOnly( target, readOnly ); + } } } } @@ -497,7 +495,6 @@ final void afterDeserialization(Boolean readOnlyBeforeAttachedToSession, ); } this.readOnlyBeforeAttachedToSession = readOnlyBeforeAttachedToSession; - this.sessionFactoryUuid = sessionFactoryUuid; this.sessionFactoryName = sessionFactoryName; this.allowLoadOutsideTransaction = allowLoadOutsideTransaction; diff --git a/hibernate-core/src/main/java/org/hibernate/proxy/HibernateProxy.java b/hibernate-core/src/main/java/org/hibernate/proxy/HibernateProxy.java index d122bd569a89..e3016aceda75 100644 --- a/hibernate-core/src/main/java/org/hibernate/proxy/HibernateProxy.java +++ b/hibernate-core/src/main/java/org/hibernate/proxy/HibernateProxy.java @@ -31,7 +31,7 @@ public interface HibernateProxy extends Serializable, PrimeAmongSecondarySuperty */ static @Nullable LazyInitializer extractLazyInitializer(final @Nullable Object object) { if ( object instanceof PrimeAmongSecondarySupertypes t ) { - final HibernateProxy hibernateProxy = t.asHibernateProxy(); + final var hibernateProxy = t.asHibernateProxy(); if ( hibernateProxy != null ) { return hibernateProxy.getHibernateLazyInitializer(); } diff --git a/hibernate-core/src/main/java/org/hibernate/proxy/ProxyConfiguration.java b/hibernate-core/src/main/java/org/hibernate/proxy/ProxyConfiguration.java index 3e03abcbed02..7e7e4eb92feb 100644 --- a/hibernate-core/src/main/java/org/hibernate/proxy/ProxyConfiguration.java +++ b/hibernate-core/src/main/java/org/hibernate/proxy/ProxyConfiguration.java @@ -89,12 +89,7 @@ public static Object intercept( @FieldValue(INTERCEPTOR_FIELD_NAME) Interceptor interceptor ) throws Throwable { if ( interceptor == null ) { - if ( method.getName().equals( "getHibernateLazyInitializer" ) ) { - return instance; - } - else { - return stubValue; - } + return method.getName().equals( "getHibernateLazyInitializer" ) ? instance : stubValue; } else { return interceptor.intercept( instance, method, arguments ); diff --git a/hibernate-core/src/main/java/org/hibernate/proxy/map/MapLazyInitializer.java b/hibernate-core/src/main/java/org/hibernate/proxy/map/MapLazyInitializer.java index 340f9842a581..279ff2de068d 100644 --- a/hibernate-core/src/main/java/org/hibernate/proxy/map/MapLazyInitializer.java +++ b/hibernate-core/src/main/java/org/hibernate/proxy/map/MapLazyInitializer.java @@ -21,7 +21,6 @@ public class MapLazyInitializer extends AbstractLazyInitializer implements Seria super( entityName, id, session ); } - @SuppressWarnings("rawtypes") public Map getMap() { return (Map) getImplementation(); } diff --git a/hibernate-core/src/main/java/org/hibernate/proxy/map/MapProxy.java b/hibernate-core/src/main/java/org/hibernate/proxy/map/MapProxy.java index 7db962859cc4..33dba08967ad 100644 --- a/hibernate-core/src/main/java/org/hibernate/proxy/map/MapProxy.java +++ b/hibernate-core/src/main/java/org/hibernate/proxy/map/MapProxy.java @@ -4,6 +4,7 @@ */ package org.hibernate.proxy.map; +import java.io.Serial; import java.io.Serializable; import java.util.Collection; import java.util.Map; @@ -17,6 +18,7 @@ * * @author Gavin King */ +@SuppressWarnings("rawtypes") public class MapProxy implements HibernateProxy, Map, Serializable { private final MapLazyInitializer li; @@ -57,23 +59,23 @@ public boolean containsValue(Object value) { return li.getMap().containsValue(value); } - @Override @SuppressWarnings("rawtypes") - public Collection values() { + @Override + public Collection values() { return li.getMap().values(); } @Override @SuppressWarnings("unchecked") - public void putAll(Map t) { - li.getMap().putAll(t); + public void putAll(Map map) { + li.getMap().putAll(map); } - @Override @SuppressWarnings("rawtypes") - public Set entrySet() { + @Override + public Set entrySet() { return li.getMap().entrySet(); } - @Override @SuppressWarnings("rawtypes") - public Set keySet() { + @Override + public Set keySet() { return li.getMap().keySet(); } @@ -92,6 +94,7 @@ public Object put(Object key, Object value) { return li.getMap().put(key, value); } + @Serial @Override public Object writeReplace() { /* @@ -116,7 +119,9 @@ private Object serializableProxy() { return new SerializableMapProxy( li.getEntityName(), li.getInternalIdentifier(), - ( li.isReadOnlySettingAvailable() ? Boolean.valueOf( li.isReadOnly() ) : li.isReadOnlyBeforeAttachedToSession() ), + li.isReadOnlySettingAvailable() + ? Boolean.valueOf( li.isReadOnly() ) + : li.isReadOnlyBeforeAttachedToSession(), li.getSessionFactoryUuid(), li.getSessionFactoryName(), li.isAllowLoadOutsideTransaction() diff --git a/hibernate-core/src/main/java/org/hibernate/proxy/map/SerializableMapProxy.java b/hibernate-core/src/main/java/org/hibernate/proxy/map/SerializableMapProxy.java index 5bb04d951ef6..55555ac90105 100644 --- a/hibernate-core/src/main/java/org/hibernate/proxy/map/SerializableMapProxy.java +++ b/hibernate-core/src/main/java/org/hibernate/proxy/map/SerializableMapProxy.java @@ -6,6 +6,8 @@ import org.hibernate.proxy.AbstractSerializableProxy; +import java.io.Serial; + public final class SerializableMapProxy extends AbstractSerializableProxy { public SerializableMapProxy( @@ -18,8 +20,9 @@ public SerializableMapProxy( super( entityName, id, readOnly, sessionFactoryUuid, sessionFactoryName, allowLoadOutsideTransaction ); } + @Serial private Object readResolve() { - MapLazyInitializer initializer = new MapLazyInitializer( getEntityName(), getId(), null ); + final var initializer = new MapLazyInitializer( getEntityName(), getId(), null ); afterDeserialization( initializer ); return new MapProxy( initializer ); } diff --git a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/BasicLazyInitializer.java b/hibernate-core/src/main/java/org/hibernate/proxy/pojo/BasicLazyInitializer.java index 4d7399aae02f..1f8960e14a4c 100644 --- a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/BasicLazyInitializer.java +++ b/hibernate-core/src/main/java/org/hibernate/proxy/pojo/BasicLazyInitializer.java @@ -7,13 +7,13 @@ import java.lang.reflect.Method; import org.hibernate.LazyInitializationException; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.util.MarkerObject; -import org.hibernate.persister.entity.EntityPersister; import org.hibernate.proxy.AbstractLazyInitializer; import org.hibernate.type.CompositeType; +import static java.lang.System.identityHashCode; + /** * Lazy initializer for plain Java objects. * @@ -51,32 +51,32 @@ protected BasicLazyInitializer( protected abstract Object serializableProxy(); protected final Object invoke(Method method, Object[] args, Object proxy) throws Throwable { - String methodName = method.getName(); - int params = args.length; - - if ( params == 0 ) { - if ( "writeReplace".equals( methodName ) ) { - return getReplacement(); - } - else if ( !overridesEquals && "hashCode".equals( methodName ) ) { - return System.identityHashCode( proxy ); - } - else if ( isUninitialized() && method.equals( getIdentifierMethod ) ) { - return getIdentifier(); - } - else if ( "getHibernateLazyInitializer".equals( methodName ) ) { - return this; - } - } - else if ( params == 1 ) { - if ( !overridesEquals && "equals".equals( methodName ) ) { - return args[0] == proxy; - } - else if ( method.equals( setIdentifierMethod ) ) { - initialize(); - setIdentifier( args[0] ); - return INVOKE_IMPLEMENTATION; - } + final String methodName = method.getName(); + switch ( args.length ) { + case 0: + if ( "writeReplace".equals( methodName ) ) { + return getReplacement(); + } + else if ( !overridesEquals && "hashCode".equals( methodName ) ) { + return identityHashCode( proxy ); + } + else if ( isUninitialized() && method.equals( getIdentifierMethod ) ) { + return getIdentifier(); + } + else if ( "getHibernateLazyInitializer".equals( methodName ) ) { + return this; + } + break; + case 1: + if ( !overridesEquals && "equals".equals( methodName ) ) { + return args[0] == proxy; + } + else if ( method.equals( setIdentifierMethod ) ) { + initialize(); + setIdentifier( args[0] ); + return INVOKE_IMPLEMENTATION; + } + break; } //if it is a property of an embedded component, invoke on the "identifier" @@ -90,10 +90,9 @@ else if ( method.equals( setIdentifierMethod ) ) { } private Object getReplacement() { - /* - * If the target has already been loaded somewhere, just not set on the proxy, - * then use it to initialize the proxy so that we will serialize that instead of the proxy. - */ + // If the target has already been loaded somewhere, just not + // set on the proxy, then use it to initialize the proxy so + // that we will serialize that instead of the proxy. initializeWithoutLoadIfPossible(); if ( isUninitialized() ) { @@ -119,16 +118,19 @@ public Class getImplementationClass() { if ( !isUninitialized() ) { return getImplementation().getClass(); } - final SharedSessionContractImplementor session = getSession(); - if ( session == null ) { - throw new LazyInitializationException( "could not retrieve real entity class [" + getEntityName() + "#" + getInternalIdentifier() + "] - no Session" ); - } - final SessionFactoryImplementor factory = session.getFactory(); - final EntityPersister entityDescriptor = factory.getMappingMetamodel().getEntityDescriptor( getEntityName() ); - if ( entityDescriptor.hasSubclasses() ) { - return getImplementation().getClass(); + else { + final var session = getSession(); + if ( session == null ) { + throw new LazyInitializationException( "could not retrieve real entity class [" + + getEntityName() + "#" + getInternalIdentifier() + "] - no Session" ); + } + final var entityDescriptor = + session.getFactory().getMappingMetamodel() + .getEntityDescriptor( getEntityName() ); + return entityDescriptor.hasSubclasses() + ? getImplementation().getClass() + : persistentClass; } - return persistentClass; } } diff --git a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/ProxyFactoryHelper.java b/hibernate-core/src/main/java/org/hibernate/proxy/pojo/ProxyFactoryHelper.java index 4673ddbbd551..12fd15206bf4 100644 --- a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/ProxyFactoryHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/proxy/pojo/ProxyFactoryHelper.java @@ -22,7 +22,10 @@ * Most of this code was originally an internal detail of {@code PojoEntityTuplizer}, * then extracted to make it easier for integrators to initialize a custom * {@link org.hibernate.proxy.ProxyFactory}. + * + * @deprecated No longer used. Will be removed. */ +@Deprecated(since = "7.2", forRemoval = true) public final class ProxyFactoryHelper { private ProxyFactoryHelper() { diff --git a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/ByteBuddyInterceptor.java b/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/ByteBuddyInterceptor.java index 8443b5a0b830..9110f0a858ad 100644 --- a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/ByteBuddyInterceptor.java +++ b/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/ByteBuddyInterceptor.java @@ -9,12 +9,12 @@ import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.CoreMessageLogger; -import org.hibernate.internal.util.ReflectHelper; import org.hibernate.proxy.ProxyConfiguration; import org.hibernate.proxy.pojo.BasicLazyInitializer; import org.hibernate.type.CompositeType; import static org.hibernate.internal.CoreLogging.messageLogger; +import static org.hibernate.internal.util.ReflectHelper.isPublic; public class ByteBuddyInterceptor extends BasicLazyInitializer implements ProxyConfiguration.Interceptor { private static final CoreMessageLogger LOG = messageLogger( ByteBuddyInterceptor.class ); @@ -36,33 +36,34 @@ public ByteBuddyInterceptor( } @Override - public Object intercept(Object proxy, Method thisMethod, Object[] args) throws Throwable { - Object result = this.invoke( thisMethod, args, proxy ); + public Object intercept(Object proxy, Method method, Object[] args) throws Throwable { + final Object result = this.invoke( method, args, proxy ); if ( result == INVOKE_IMPLEMENTATION ) { - Object target = getImplementation(); + final Object target = getImplementation(); final Object returnValue; try { - if ( ReflectHelper.isPublic( persistentClass, thisMethod ) ) { - if ( !thisMethod.getDeclaringClass().isInstance( target ) ) { + if ( isPublic( persistentClass, method ) ) { + if ( !method.getDeclaringClass().isInstance( target ) ) { throw new ClassCastException( target.getClass().getName() + " incompatible with " - + thisMethod.getDeclaringClass().getName() + + method.getDeclaringClass().getName() ); } - returnValue = thisMethod.invoke( target, args ); + returnValue = method.invoke( target, args ); } else { - thisMethod.setAccessible( true ); - returnValue = thisMethod.invoke( target, args ); + method.setAccessible( true ); + returnValue = method.invoke( target, args ); } if ( returnValue == target ) { - if ( returnValue.getClass().isInstance( proxy ) ) { + final var returnValueClass = returnValue.getClass(); + if ( returnValueClass.isInstance( proxy ) ) { return proxy; } else { - LOG.narrowingProxy( returnValue.getClass() ); + LOG.narrowingProxy( returnValueClass ); } } return returnValue; @@ -83,7 +84,9 @@ protected Object serializableProxy() { persistentClass, interfaces, getInternalIdentifier(), - ( isReadOnlySettingAvailable() ? Boolean.valueOf( isReadOnly() ) : isReadOnlyBeforeAttachedToSession() ), + isReadOnlySettingAvailable() + ? Boolean.valueOf( isReadOnly() ) + : isReadOnlyBeforeAttachedToSession(), getSessionFactoryUuid(), getSessionFactoryName(), isAllowLoadOutsideTransaction(), diff --git a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/ByteBuddyProxyFactory.java b/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/ByteBuddyProxyFactory.java index 16755c5eb21f..a30e0498bd8b 100644 --- a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/ByteBuddyProxyFactory.java +++ b/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/ByteBuddyProxyFactory.java @@ -13,7 +13,6 @@ import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.util.ReflectHelper; import org.hibernate.proxy.HibernateProxy; -import org.hibernate.proxy.ProxyConfiguration; import org.hibernate.proxy.ProxyFactory; import org.hibernate.type.CompositeType; @@ -52,7 +51,6 @@ public void postInstantiate( this.setIdentifierMethod = setIdentifierMethod; this.componentIdType = componentIdType; this.overridesEquals = ReflectHelper.overridesEquals( persistentClass ); - this.proxyClass = byteBuddyProxyHelper.buildProxy( persistentClass, this.interfaces ); } @@ -64,7 +62,7 @@ private Class[] toArray(Set> interfaces) { public HibernateProxy getProxy( Object id, SharedSessionContractImplementor session) throws HibernateException { - final ByteBuddyInterceptor interceptor = new ByteBuddyInterceptor( + final var interceptor = new ByteBuddyInterceptor( entityName, persistentClass, interfaces, @@ -76,8 +74,8 @@ public HibernateProxy getProxy( overridesEquals ); - final HibernateProxy instance = getHibernateProxy(); - final ProxyConfiguration proxyConfiguration = instance.asProxyConfiguration(); + final var instance = getHibernateProxy(); + final var proxyConfiguration = instance.asProxyConfiguration(); if ( proxyConfiguration == null ) { throw new HibernateException( "Produced proxy does not correctly implement ProxyConfiguration" ); } @@ -86,8 +84,8 @@ public HibernateProxy getProxy( } private HibernateProxy getHibernateProxy() { - final PrimeAmongSecondarySupertypes internal = getHibernateProxyInternal(); - final HibernateProxy hibernateProxy = internal.asHibernateProxy(); + final var internal = getHibernateProxyInternal(); + final var hibernateProxy = internal.asHibernateProxy(); if ( hibernateProxy == null ) { throw new HibernateException( "Produced proxy does not correctly implement HibernateProxy" ); } diff --git a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/ByteBuddyProxyHelper.java b/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/ByteBuddyProxyHelper.java index a9374ff230c8..6f3dae11272e 100644 --- a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/ByteBuddyProxyHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/ByteBuddyProxyHelper.java @@ -15,7 +15,6 @@ import org.hibernate.bytecode.enhance.internal.bytebuddy.EnhancerImplConstants; import org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState; import org.hibernate.engine.spi.PrimeAmongSecondarySupertypes; -import org.hibernate.internal.util.ReflectHelper; import org.hibernate.proxy.HibernateProxy; import org.hibernate.proxy.ProxyConfiguration; @@ -29,6 +28,8 @@ import net.bytebuddy.implementation.SuperMethodCall; import net.bytebuddy.pool.TypePool; +import static org.hibernate.internal.util.ReflectHelper.overridesEquals; + public class ByteBuddyProxyHelper implements Serializable { private static final String PROXY_NAMING_SUFFIX = "HibernateProxy"; @@ -42,13 +43,13 @@ public ByteBuddyProxyHelper(ByteBuddyState byteBuddyState) { this.constants = byteBuddyState.getEnhancerConstants(); } - @SuppressWarnings("rawtypes") - public Class buildProxy( + public Class buildProxy( final Class persistentClass, final Class[] interfaces) { final String proxyClassName = persistentClass.getTypeName() + "$" + PROXY_NAMING_SUFFIX; return byteBuddyState.loadProxy( persistentClass, proxyClassName, - proxyBuilder( TypeDescription.ForLoadedType.of( persistentClass ), new TypeList.Generic.ForLoadedTypes( interfaces ) ) ); + proxyBuilder( TypeDescription.ForLoadedType.of( persistentClass ), + new TypeList.Generic.ForLoadedTypes( interfaces ) ) ); } /** @@ -63,6 +64,7 @@ public DynamicType.Unloaded buildUnloadedProxy(final Class persistentClass /** * Do not remove: used by Quarkus */ + @SuppressWarnings("unused") public DynamicType.Unloaded buildUnloadedProxy(TypePool typePool, TypeDefinition persistentClass, Collection interfaces) { return byteBuddyState.make( typePool, proxyBuilderLegacy( persistentClass, interfaces ) ); @@ -70,16 +72,16 @@ public DynamicType.Unloaded buildUnloadedProxy(TypePool typePool, TypeDefinit private Function> proxyBuilderLegacy(TypeDefinition persistentClass, Collection interfaces) { - final BiFunction> proxyBuilder = - proxyBuilder( persistentClass, interfaces ); - final NamingStrategy.Suffixing namingStrategy = - new NamingStrategy.Suffixing( PROXY_NAMING_SUFFIX, new NamingStrategy.Suffixing.BaseNameResolver.ForFixedValue( persistentClass.getTypeName() ) ); + final var proxyBuilder = proxyBuilder( persistentClass, interfaces ); + final var namingStrategy = + new NamingStrategy.Suffixing( PROXY_NAMING_SUFFIX, + new NamingStrategy.Suffixing.BaseNameResolver.ForFixedValue( persistentClass.getTypeName() ) ); return byteBuddy -> proxyBuilder.apply( byteBuddy, namingStrategy ); } private BiFunction> proxyBuilder(TypeDefinition persistentClass, Collection interfaces) { - ByteBuddyState.ProxyDefinitionHelpers helpers = byteBuddyState.getProxyDefinitionHelpers(); + var helpers = byteBuddyState.getProxyDefinitionHelpers(); return (byteBuddy, namingStrategy) -> helpers.appendIgnoreAlsoAtEnd( byteBuddy .ignore( helpers.getGroovyGetMetaClassFilter() ) .with( namingStrategy ) @@ -95,32 +97,29 @@ private BiFunction> proxyBuild ); } - public HibernateProxy deserializeProxy(SerializableProxy serializableProxy) { - final ByteBuddyInterceptor interceptor = new ByteBuddyInterceptor( - serializableProxy.getEntityName(), - serializableProxy.getPersistentClass(), - serializableProxy.getInterfaces(), - serializableProxy.getId(), - resolveIdGetterMethod( serializableProxy ), - resolveIdSetterMethod( serializableProxy ), - serializableProxy.getComponentIdType(), + public HibernateProxy deserializeProxy(SerializableProxy proxy) { + final var interceptor = new ByteBuddyInterceptor( + proxy.getEntityName(), + proxy.getPersistentClass(), + proxy.getInterfaces(), + proxy.getId(), + resolveIdGetterMethod( proxy ), + resolveIdSetterMethod( proxy ), + proxy.getComponentIdType(), null, - ReflectHelper.overridesEquals( serializableProxy.getPersistentClass() ) + overridesEquals( proxy.getPersistentClass() ) ); // note: interface is assumed to already contain HibernateProxy.class try { - final Class proxyClass = buildProxy( - serializableProxy.getPersistentClass(), - serializableProxy.getInterfaces() - ); - PrimeAmongSecondarySupertypes instance = (PrimeAmongSecondarySupertypes) proxyClass.getDeclaredConstructor().newInstance(); - final ProxyConfiguration proxyConfiguration = instance.asProxyConfiguration(); + final var proxyClass = buildProxy( proxy.getPersistentClass(), proxy.getInterfaces() ); + final var instance = (PrimeAmongSecondarySupertypes) proxyClass.getDeclaredConstructor().newInstance(); + final var proxyConfiguration = instance.asProxyConfiguration(); if ( proxyConfiguration == null ) { throw new HibernateException( "Produced proxy does not correctly implement ProxyConfiguration" ); } proxyConfiguration.$$_hibernate_set_interceptor( interceptor ); - final HibernateProxy hibernateProxy = instance.asHibernateProxy(); + final var hibernateProxy = instance.asHibernateProxy(); if ( hibernateProxy == null ) { throw new HibernateException( "Produced proxy does not correctly implement HibernateProxy" ); } @@ -128,7 +127,7 @@ public HibernateProxy deserializeProxy(SerializableProxy serializableProxy) { } catch (Throwable t) { throw new HibernateException( "Bytecode enhancement failed for entity '" - + serializableProxy.getEntityName() + "'", t ); + + proxy.getEntityName() + "'", t ); } } @@ -138,7 +137,8 @@ private static Method resolveIdGetterMethod(SerializableProxy serializableProxy) } try { - return serializableProxy.getIdentifierGetterMethodClass().getDeclaredMethod( serializableProxy.getIdentifierGetterMethodName() ); + return serializableProxy.getIdentifierGetterMethodClass() + .getDeclaredMethod( serializableProxy.getIdentifierGetterMethodName() ); } catch (NoSuchMethodException e) { throw new HibernateException( @@ -160,10 +160,9 @@ private static Method resolveIdSetterMethod(SerializableProxy serializableProxy) } try { - return serializableProxy.getIdentifierSetterMethodClass().getDeclaredMethod( - serializableProxy.getIdentifierSetterMethodName(), - serializableProxy.getIdentifierSetterMethodParams() - ); + return serializableProxy.getIdentifierSetterMethodClass() + .getDeclaredMethod( serializableProxy.getIdentifierSetterMethodName(), + serializableProxy.getIdentifierSetterMethodParams() ); } catch (NoSuchMethodException e) { throw new HibernateException( diff --git a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/SerializableProxy.java b/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/SerializableProxy.java index dd1c3367b3c8..a7f02e94e4fc 100644 --- a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/SerializableProxy.java +++ b/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/SerializableProxy.java @@ -4,6 +4,7 @@ */ package org.hibernate.proxy.pojo.bytebuddy; +import java.io.Serial; import java.lang.reflect.Method; import java.util.Objects; @@ -12,7 +13,6 @@ import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.internal.SessionFactoryRegistry; import org.hibernate.proxy.AbstractSerializableProxy; -import org.hibernate.proxy.HibernateProxy; import org.hibernate.type.CompositeType; import static org.hibernate.bytecode.internal.BytecodeProviderInitiator.buildDefaultBytecodeProvider; @@ -112,10 +112,11 @@ CompositeType getComponentIdType() { return componentIdType; } + @Serial private Object readResolve() { - final SessionFactoryImplementor sessionFactory = retrieveMatchingSessionFactory( this.sessionFactoryUuid, this.sessionFactoryName ); - BytecodeProviderImpl byteBuddyBytecodeProvider = retrieveByteBuddyBytecodeProvider( sessionFactory ); - HibernateProxy proxy = byteBuddyBytecodeProvider.getByteBuddyProxyHelper().deserializeProxy( this ); + final var sessionFactory = retrieveMatchingSessionFactory( this.sessionFactoryUuid, this.sessionFactoryName ); + final var byteBuddyBytecodeProvider = retrieveByteBuddyBytecodeProvider( sessionFactory ); + final var proxy = byteBuddyBytecodeProvider.getByteBuddyProxyHelper().deserializeProxy( this ); afterDeserialization( (ByteBuddyInterceptor) proxy.getHibernateLazyInitializer() ); return proxy; } @@ -126,16 +127,14 @@ private static SessionFactoryImplementor retrieveMatchingSessionFactory(final St } private static BytecodeProviderImpl retrieveByteBuddyBytecodeProvider(final SessionFactoryImplementor sessionFactory) { - if ( sessionFactory == null ) { - // When the session factory is not available fallback to local bytecode provider - return getFallbackBytecodeProvider(); - } + return sessionFactory == null + ? getFallbackBytecodeProvider() // When the session factory is not available fallback to local bytecode provider + : castBytecodeProvider( sessionFactory.getServiceRegistry().getService( BytecodeProvider.class ) ); - return castBytecodeProvider( sessionFactory.getServiceRegistry().getService( BytecodeProvider.class ) ); } private static BytecodeProviderImpl getFallbackBytecodeProvider() { - BytecodeProviderImpl provider = fallbackBytecodeProvider; + var provider = fallbackBytecodeProvider; if ( provider == null ) { provider = fallbackBytecodeProvider = castBytecodeProvider( buildDefaultBytecodeProvider() ); }