diff --git a/hibernate-core/src/main/java/org/hibernate/action/internal/BulkOperationCleanupAction.java b/hibernate-core/src/main/java/org/hibernate/action/internal/BulkOperationCleanupAction.java index 97745d8768..839e081fcc 100644 --- a/hibernate-core/src/main/java/org/hibernate/action/internal/BulkOperationCleanupAction.java +++ b/hibernate-core/src/main/java/org/hibernate/action/internal/BulkOperationCleanupAction.java @@ -22,6 +22,7 @@ import org.hibernate.cache.spi.access.SoftLock; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.metamodel.spi.MetamodelImplementor; import org.hibernate.persister.collection.CollectionPersister; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.persister.entity.Queryable; @@ -111,7 +112,8 @@ public BulkOperationCleanupAction(SharedSessionContractImplementor session, Set spacesList.addAll( tableSpaces ); final SessionFactoryImplementor factory = session.getFactory(); - for ( EntityPersister persister : factory.getMetamodel().entityPersisters().values() ) { + final MetamodelImplementor metamodel = factory.getMetamodel(); + for ( EntityPersister persister : metamodel.entityPersisters().values() ) { final String[] entitySpaces = (String[]) persister.getQuerySpaces(); if ( affectedEntity( tableSpaces, entitySpaces ) ) { spacesList.addAll( Arrays.asList( entitySpaces ) ); @@ -123,10 +125,10 @@ public BulkOperationCleanupAction(SharedSessionContractImplementor session, Set naturalIdCleanups.add( new NaturalIdCleanup( persister.getNaturalIdCacheAccessStrategy(), session ) ); } - final Set roles = session.getFactory().getMetamodel().getCollectionRolesByEntityParticipant( persister.getEntityName() ); + final Set roles = metamodel.getCollectionRolesByEntityParticipant( persister.getEntityName() ); if ( roles != null ) { for ( String role : roles ) { - final CollectionPersister collectionPersister = factory.getMetamodel().collectionPersister( role ); + final CollectionPersister collectionPersister = metamodel.collectionPersister( role ); if ( collectionPersister.hasCache() ) { collectionCleanups.add( new CollectionCleanup( collectionPersister.getCacheAccessStrategy(), session ) diff --git a/hibernate-core/src/main/java/org/hibernate/action/internal/CollectionUpdateAction.java b/hibernate-core/src/main/java/org/hibernate/action/internal/CollectionUpdateAction.java index 8feb218d89..e44805c281 100644 --- a/hibernate-core/src/main/java/org/hibernate/action/internal/CollectionUpdateAction.java +++ b/hibernate-core/src/main/java/org/hibernate/action/internal/CollectionUpdateAction.java @@ -95,7 +95,7 @@ else if ( collection.needsRecreate( persister ) ) { final StatisticsImplementor statistics = session.getFactory().getStatistics(); if ( statistics.isStatisticsEnabled() ) { - statistics.updateCollection( getPersister().getRole() ); + statistics.updateCollection( persister.getRole() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/action/internal/EntityInsertAction.java b/hibernate-core/src/main/java/org/hibernate/action/internal/EntityInsertAction.java index d6bf42bb40..f33e682f6a 100644 --- a/hibernate-core/src/main/java/org/hibernate/action/internal/EntityInsertAction.java +++ b/hibernate-core/src/main/java/org/hibernate/action/internal/EntityInsertAction.java @@ -222,8 +222,9 @@ public void doAfterTransactionCompletion(boolean success, SharedSessionContractI final Object ck = cache.generateCacheKey( getId(), persister, factory, session.getTenantIdentifier() ); final boolean put = cacheAfterInsert( cache, ck ); - if ( put && factory.getStatistics().isStatisticsEnabled() ) { - factory.getStatistics().entityCachePut( + final StatisticsImplementor statistics = factory.getStatistics(); + if ( put && statistics.isStatisticsEnabled() ) { + statistics.entityCachePut( StatsHelper.INSTANCE.getRootEntityRole( persister ), cache.getRegion().getName() ); diff --git a/hibernate-core/src/main/java/org/hibernate/action/internal/EntityUpdateAction.java b/hibernate-core/src/main/java/org/hibernate/action/internal/EntityUpdateAction.java index 13a69241cc..ff19ec265d 100644 --- a/hibernate-core/src/main/java/org/hibernate/action/internal/EntityUpdateAction.java +++ b/hibernate-core/src/main/java/org/hibernate/action/internal/EntityUpdateAction.java @@ -320,10 +320,11 @@ public void doAfterTransactionCompletion(boolean success, SharedSessionContractI final EntityPersister persister = getPersister(); if ( persister.canWriteToCache() ) { final EntityDataAccess cache = persister.getCacheAccessStrategy(); + final SessionFactoryImplementor factory = session.getFactory(); final Object ck = cache.generateCacheKey( getId(), persister, - session.getFactory(), + factory, session.getTenantIdentifier() ); @@ -334,15 +335,16 @@ public void doAfterTransactionCompletion(boolean success, SharedSessionContractI session.getCacheMode().isPutEnabled() ) { final boolean put = cacheAfterUpdate( cache, ck ); - if ( put && getSession().getFactory().getStatistics().isStatisticsEnabled() ) { - session.getFactory().getStatistics().entityCachePut( + final StatisticsImplementor statistics = factory.getStatistics(); + if ( put && statistics.isStatisticsEnabled() ) { + statistics.entityCachePut( StatsHelper.INSTANCE.getRootEntityRole( persister ), - getPersister().getCacheAccessStrategy().getRegion().getName() + cache.getRegion().getName() ); } } else { - cache.unlockItem(session, ck, lock ); + cache.unlockItem( session, ck, lock ); } } postCommitUpdate( success ); diff --git a/hibernate-core/src/main/java/org/hibernate/cache/internal/CollectionCacheInvalidator.java b/hibernate-core/src/main/java/org/hibernate/cache/internal/CollectionCacheInvalidator.java index b22ab86d84..e3d35c0b7e 100644 --- a/hibernate-core/src/main/java/org/hibernate/cache/internal/CollectionCacheInvalidator.java +++ b/hibernate-core/src/main/java/org/hibernate/cache/internal/CollectionCacheInvalidator.java @@ -13,6 +13,8 @@ import org.hibernate.action.internal.CollectionAction; import org.hibernate.action.spi.AfterTransactionCompletionProcess; import org.hibernate.boot.Metadata; +import org.hibernate.boot.spi.SessionFactoryOptions; +import org.hibernate.cache.spi.access.CollectionDataAccess; import org.hibernate.cache.spi.access.SoftLock; import org.hibernate.collection.spi.PersistentCollection; import org.hibernate.engine.spi.SessionFactoryImplementor; @@ -27,9 +29,11 @@ import org.hibernate.event.spi.PostUpdateEvent; import org.hibernate.event.spi.PostUpdateEventListener; import org.hibernate.integrator.spi.Integrator; +import org.hibernate.metamodel.spi.MetamodelImplementor; import org.hibernate.persister.collection.CollectionPersister; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.service.spi.SessionFactoryServiceRegistry; +import org.hibernate.tuple.entity.EntityMetamodel; import org.jboss.logging.Logger; @@ -82,11 +86,12 @@ public void onPostUpdate(PostUpdateEvent event) { } private void integrate(SessionFactoryServiceRegistry serviceRegistry, SessionFactoryImplementor sessionFactory) { - if ( !sessionFactory.getSessionFactoryOptions().isAutoEvictCollectionCache() ) { + final SessionFactoryOptions sessionFactoryOptions = sessionFactory.getSessionFactoryOptions(); + if ( !sessionFactoryOptions.isAutoEvictCollectionCache() ) { // feature is disabled return; } - if ( !sessionFactory.getSessionFactoryOptions().isSecondLevelCacheEnabled() ) { + if ( !sessionFactoryOptions.isSecondLevelCacheEnabled() ) { // Nothing to do, if caching is disabled return; } @@ -100,12 +105,14 @@ private void evictCache(Object entity, EntityPersister persister, EventSource se try { SessionFactoryImplementor factory = persister.getFactory(); - Set collectionRoles = factory.getMetamodel().getCollectionRolesByEntityParticipant( persister.getEntityName() ); + final MetamodelImplementor metamodel = factory.getMetamodel(); + Set collectionRoles = metamodel.getCollectionRolesByEntityParticipant( persister.getEntityName() ); if ( collectionRoles == null || collectionRoles.isEmpty() ) { return; } + final EntityMetamodel entityMetamodel = persister.getEntityMetamodel(); for ( String role : collectionRoles ) { - final CollectionPersister collectionPersister = factory.getMetamodel().collectionPersister( role ); + final CollectionPersister collectionPersister = metamodel.collectionPersister( role ); if ( !collectionPersister.hasCache() ) { // ignore collection if no caching is used continue; @@ -114,7 +121,7 @@ private void evictCache(Object entity, EntityPersister persister, EventSource se String mappedBy = collectionPersister.getMappedByProperty(); if ( !collectionPersister.isManyToMany() && mappedBy != null && !mappedBy.isEmpty() ) { - int i = persister.getEntityMetamodel().getPropertyIndex( mappedBy ); + int i = entityMetamodel.getPropertyIndex( mappedBy ); Serializable oldId = null; if ( oldState != null ) { // in case of updating an entity we perhaps have to decache 2 entity collections, this is the @@ -136,9 +143,10 @@ private void evictCache(Object entity, EntityPersister persister, EventSource se } else { LOG.debug( "Evict CollectionRegion " + role ); - final SoftLock softLock = collectionPersister.getCacheAccessStrategy().lockRegion(); + final CollectionDataAccess cacheAccessStrategy = collectionPersister.getCacheAccessStrategy(); + final SoftLock softLock = cacheAccessStrategy.lockRegion(); session.getActionQueue().registerProcess( (success, session1) -> { - collectionPersister.getCacheAccessStrategy().unlockRegion( softLock ); + cacheAccessStrategy.unlockRegion( softLock ); } ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/cache/internal/TimestampsCacheEnabledImpl.java b/hibernate-core/src/main/java/org/hibernate/cache/internal/TimestampsCacheEnabledImpl.java index 1b3a5886c7..6467260c01 100644 --- a/hibernate-core/src/main/java/org/hibernate/cache/internal/TimestampsCacheEnabledImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/cache/internal/TimestampsCacheEnabledImpl.java @@ -11,8 +11,10 @@ import org.hibernate.cache.spi.RegionFactory; import org.hibernate.cache.spi.TimestampsRegion; import org.hibernate.cache.spi.TimestampsCache; +import org.hibernate.engine.spi.SessionEventListenerManager; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.stat.spi.StatisticsImplementor; import org.jboss.logging.Logger; @@ -42,28 +44,32 @@ public void preInvalidate( final SessionFactoryImplementor factory = session.getFactory(); final RegionFactory regionFactory = factory.getCache().getRegionFactory(); - final boolean stats = factory.getStatistics().isStatisticsEnabled(); + final StatisticsImplementor statistics = factory.getStatistics(); + final boolean stats = statistics.isStatisticsEnabled(); final Long ts = regionFactory.nextTimestamp() + regionFactory.getTimeout(); + final SessionEventListenerManager eventListenerManager = session.getEventListenerManager(); + final boolean debugEnabled = log.isDebugEnabled(); + for ( Serializable space : spaces ) { - if ( log.isDebugEnabled() ) { + if ( debugEnabled ) { log.debugf( "Pre-invalidating space [%s], timestamp: %s", space, ts ); } try { - session.getEventListenerManager().cachePutStart(); + eventListenerManager.cachePutStart(); //put() has nowait semantics, is this really appropriate? //note that it needs to be async replication, never local or sync timestampsRegion.putIntoCache( space, ts, session ); } finally { - session.getEventListenerManager().cachePutEnd(); + eventListenerManager.cachePutEnd(); } if ( stats ) { - factory.getStatistics().updateTimestampsCachePut(); + statistics.updateTimestampsCachePut(); } } } @@ -72,24 +78,27 @@ public void preInvalidate( public void invalidate( String[] spaces, SharedSessionContractImplementor session) { - final boolean stats = session.getFactory().getStatistics().isStatisticsEnabled(); + final StatisticsImplementor statistics = session.getFactory().getStatistics(); + final boolean stats = statistics.isStatisticsEnabled(); final Long ts = session.getFactory().getCache().getRegionFactory().nextTimestamp(); + final boolean debugEnabled = log.isDebugEnabled(); - for (Serializable space : spaces) { - if ( log.isDebugEnabled() ) { + for ( Serializable space : spaces ) { + if ( debugEnabled ) { log.debugf( "Invalidating space [%s], timestamp: %s", space, ts ); } + final SessionEventListenerManager eventListenerManager = session.getEventListenerManager(); try { - session.getEventListenerManager().cachePutStart(); + eventListenerManager.cachePutStart(); timestampsRegion.putIntoCache( space, ts, session ); } finally { - session.getEventListenerManager().cachePutEnd(); + eventListenerManager.cachePutEnd(); if ( stats ) { - session.getFactory().getStatistics().updateTimestampsCachePut(); + statistics.updateTimestampsCachePut(); } } } @@ -100,7 +109,10 @@ public boolean isUpToDate( String[] spaces, Long timestamp, SharedSessionContractImplementor session) { - final boolean stats = session.getFactory().getStatistics().isStatisticsEnabled(); + + final StatisticsImplementor statistics = session.getFactory().getStatistics(); + final boolean stats = statistics.isStatisticsEnabled(); + final boolean debugEnabled = log.isDebugEnabled(); for ( Serializable space : spaces ) { final Long lastUpdate = getLastUpdateTimestampForSpace( space, session ); @@ -108,11 +120,11 @@ public boolean isUpToDate( // the last update timestamp for the given space was evicted from the // cache or there have been no writes to it since startup if ( stats ) { - session.getFactory().getStatistics().updateTimestampsCacheMiss(); + statistics.updateTimestampsCacheMiss(); } } else { - if ( log.isDebugEnabled() ) { + if ( debugEnabled ) { log.debugf( "[%s] last update timestamp: %s", space, @@ -120,7 +132,7 @@ public boolean isUpToDate( ); } if ( stats ) { - session.getFactory().getStatistics().updateTimestampsCacheHit(); + statistics.updateTimestampsCacheHit(); } if ( lastUpdate >= timestamp ) { return false; diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/ExtendsQueueEntry.java b/hibernate-core/src/main/java/org/hibernate/cfg/ExtendsQueueEntry.java deleted file mode 100644 index e8c7fd2dbb..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/cfg/ExtendsQueueEntry.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * License: GNU Lesser General Public License (LGPL), version 2.1 or later. - * See the lgpl.txt file in the root directory or . - */ -package org.hibernate.cfg; - -import java.util.Set; - -import org.hibernate.internal.util.xml.XmlDocument; - -/** - * Represents a mapping queued for delayed processing to await - * processing of an extends entity upon which it depends. - * - * @author Steve Ebersole - */ -public class ExtendsQueueEntry { - private final String explicitName; - private final String mappingPackage; - private final XmlDocument metadataXml; - private final Set entityNames; - - public ExtendsQueueEntry(String explicitName, String mappingPackage, XmlDocument metadataXml, Set entityNames) { - this.explicitName = explicitName; - this.mappingPackage = mappingPackage; - this.metadataXml = metadataXml; - this.entityNames = entityNames; - } - - public String getExplicitName() { - return explicitName; - } - - public String getMappingPackage() { - return mappingPackage; - } - - public XmlDocument getMetadataXml() { - return metadataXml; - } - - public Set getEntityNames() { - return entityNames; - } -} diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/CollectionBinder.java b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/CollectionBinder.java index 317da67df6..ec8a65fbf9 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/CollectionBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/CollectionBinder.java @@ -70,6 +70,7 @@ import org.hibernate.annotations.common.reflection.XProperty; import org.hibernate.boot.model.IdentifierGeneratorDefinition; import org.hibernate.boot.model.TypeDefinition; +import org.hibernate.boot.spi.InFlightMetadataCollector; import org.hibernate.boot.spi.MetadataBuildingContext; import org.hibernate.cfg.AccessType; import org.hibernate.cfg.AnnotatedClassType; @@ -461,8 +462,9 @@ public void bind() { } // set explicit type information + final InFlightMetadataCollector metadataCollector = buildingContext.getMetadataCollector(); if ( explicitType != null ) { - final TypeDefinition typeDef = buildingContext.getMetadataCollector().getTypeDefinition( explicitType ); + final TypeDefinition typeDef = metadataCollector.getTypeDefinition( explicitType ); if ( typeDef == null ) { collection.setTypeName( explicitType ); collection.setTypeParameters( explicitTypeParameters ); @@ -554,7 +556,7 @@ public void bind() { //many to many may need some second pass informations if ( !oneToMany && isMappedBy ) { - buildingContext.getMetadataCollector().addMappedBy( getCollectionType().getName(), mappedBy, propertyName ); + metadataCollector.addMappedBy( getCollectionType().getName(), mappedBy, propertyName ); } //TODO reducce tableBinder != null and oneToMany XClass collectionType = getCollectionType(); @@ -580,13 +582,13 @@ public void bind() { // do it right away, otherwise @ManyToOne on composite element call addSecondPass // and raise a ConcurrentModificationException //sp.doSecondPass( CollectionHelper.EMPTY_MAP ); - buildingContext.getMetadataCollector().addSecondPass( sp, !isMappedBy ); + metadataCollector.addSecondPass( sp, !isMappedBy ); } else { - buildingContext.getMetadataCollector().addSecondPass( sp, !isMappedBy ); + metadataCollector.addSecondPass( sp, !isMappedBy ); } - buildingContext.getMetadataCollector().addCollectionBinding( collection ); + metadataCollector.addCollectionBinding( collection ); //property building PropertyBinder binder = new PropertyBinder(); diff --git a/hibernate-core/src/main/java/org/hibernate/collection/internal/AbstractPersistentCollection.java b/hibernate-core/src/main/java/org/hibernate/collection/internal/AbstractPersistentCollection.java index a2dc08254d..636d9d62e1 100644 --- a/hibernate-core/src/main/java/org/hibernate/collection/internal/AbstractPersistentCollection.java +++ b/hibernate-core/src/main/java/org/hibernate/collection/internal/AbstractPersistentCollection.java @@ -461,10 +461,11 @@ protected boolean isInverseCollection() { @SuppressWarnings({"JavaDoc"}) protected boolean isInverseCollectionNoOrphanDelete() { final CollectionEntry ce = session.getPersistenceContextInternal().getCollectionEntry( this ); - return ce != null - && - ce.getLoadedPersister().isInverse() && - !ce.getLoadedPersister().hasOrphanDelete(); + if ( ce == null ) { + return false; + } + final CollectionPersister loadedPersister = ce.getLoadedPersister(); + return loadedPersister.isInverse() && !loadedPersister.hasOrphanDelete(); } /** @@ -474,9 +475,11 @@ protected boolean isInverseCollectionNoOrphanDelete() { @SuppressWarnings({"JavaDoc"}) protected boolean isInverseOneToManyOrNoOrphanDelete() { final CollectionEntry ce = session.getPersistenceContextInternal().getCollectionEntry( this ); - return ce != null - && ce.getLoadedPersister().isInverse() - && ( ce.getLoadedPersister().isOneToMany() || !ce.getLoadedPersister().hasOrphanDelete() ); + if ( ce == null ) { + return false; + } + final CollectionPersister loadedPersister = ce.getLoadedPersister(); + return loadedPersister.isInverse() && ( loadedPersister.isOneToMany() || !loadedPersister.hasOrphanDelete() ); } /** diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticReadSelectLockingStrategy.java b/hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticReadSelectLockingStrategy.java index 99058d5938..0b1b6d3d2f 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticReadSelectLockingStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticReadSelectLockingStrategy.java @@ -15,11 +15,13 @@ import org.hibernate.LockMode; import org.hibernate.LockOptions; import org.hibernate.StaleObjectStateException; +import org.hibernate.engine.jdbc.spi.JdbcCoordinator; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.persister.entity.Lockable; import org.hibernate.pretty.MessageHelper; import org.hibernate.sql.SimpleSelect; +import org.hibernate.stat.spi.StatisticsImplementor; /** * A pessimistic locking strategy where the locks are obtained through select statements. @@ -55,42 +57,45 @@ public void lock(Serializable id, Object version, Object object, int timeout, Sh final String sql = determineSql( timeout ); final SessionFactoryImplementor factory = session.getFactory(); try { + final Lockable lockable = getLockable(); try { - final PreparedStatement st = session.getJdbcCoordinator().getStatementPreparer().prepareStatement( sql ); + final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator(); + final PreparedStatement st = jdbcCoordinator.getStatementPreparer().prepareStatement( sql ); try { - getLockable().getIdentifierType().nullSafeSet( st, id, 1, session ); - if ( getLockable().isVersioned() ) { - getLockable().getVersionType().nullSafeSet( + lockable.getIdentifierType().nullSafeSet( st, id, 1, session ); + if ( lockable.isVersioned() ) { + lockable.getVersionType().nullSafeSet( st, version, - getLockable().getIdentifierType().getColumnSpan( factory ) + 1, + lockable.getIdentifierType().getColumnSpan( factory ) + 1, session ); } - final ResultSet rs = session.getJdbcCoordinator().getResultSetReturn().extract( st ); + final ResultSet rs = jdbcCoordinator.getResultSetReturn().extract( st ); try { if ( !rs.next() ) { - if ( factory.getStatistics().isStatisticsEnabled() ) { - factory.getStatistics().optimisticFailure( getLockable().getEntityName() ); + final StatisticsImplementor statistics = factory.getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.optimisticFailure( lockable.getEntityName() ); } - throw new StaleObjectStateException( getLockable().getEntityName(), id ); + throw new StaleObjectStateException( lockable.getEntityName(), id ); } } finally { - session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( rs, st ); + jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( rs, st ); } } finally { - session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( st ); - session.getJdbcCoordinator().afterStatementExecution(); + jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( st ); + jdbcCoordinator.afterStatementExecution(); } } catch ( SQLException e ) { throw session.getJdbcServices().getSqlExceptionHelper().convert( e, - "could not lock: " + MessageHelper.infoString( getLockable(), id, session.getFactory() ), + "could not lock: " + MessageHelper.infoString( lockable, id, session.getFactory() ), sql ); } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticReadUpdateLockingStrategy.java b/hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticReadUpdateLockingStrategy.java index 50dcf9e036..ab15b9cd5f 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticReadUpdateLockingStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticReadUpdateLockingStrategy.java @@ -14,12 +14,14 @@ import org.hibernate.JDBCException; import org.hibernate.LockMode; import org.hibernate.StaleObjectStateException; +import org.hibernate.engine.jdbc.spi.JdbcCoordinator; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.CoreMessageLogger; import org.hibernate.persister.entity.Lockable; import org.hibernate.pretty.MessageHelper; import org.hibernate.sql.Update; +import org.hibernate.stat.spi.StatisticsImplementor; import org.jboss.logging.Logger; @@ -75,7 +77,8 @@ public void lock(Serializable id, Object version, Object object, int timeout, Sh final SessionFactoryImplementor factory = session.getFactory(); try { try { - final PreparedStatement st = session.getJdbcCoordinator().getStatementPreparer().prepareStatement( sql ); + final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator(); + final PreparedStatement st = jdbcCoordinator.getStatementPreparer().prepareStatement( sql ); try { lockable.getVersionType().nullSafeSet( st, version, 1, session ); int offset = 2; @@ -87,19 +90,20 @@ public void lock(Serializable id, Object version, Object object, int timeout, Sh lockable.getVersionType().nullSafeSet( st, version, offset, session ); } - final int affected = session.getJdbcCoordinator().getResultSetReturn().executeUpdate( st ); + final int affected = jdbcCoordinator.getResultSetReturn().executeUpdate( st ); // todo: should this instead check for exactly one row modified? if ( affected < 0 ) { - if (factory.getStatistics().isStatisticsEnabled()) { - factory.getStatistics().optimisticFailure( lockable.getEntityName() ); + final StatisticsImplementor statistics = factory.getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.optimisticFailure( lockable.getEntityName() ); } throw new StaleObjectStateException( lockable.getEntityName(), id ); } } finally { - session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( st ); - session.getJdbcCoordinator().afterStatementExecution(); + jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( st ); + jdbcCoordinator.afterStatementExecution(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticWriteSelectLockingStrategy.java b/hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticWriteSelectLockingStrategy.java index 86ef9e61ee..bdd6bd29f4 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticWriteSelectLockingStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticWriteSelectLockingStrategy.java @@ -15,11 +15,13 @@ import org.hibernate.LockMode; import org.hibernate.LockOptions; import org.hibernate.StaleObjectStateException; +import org.hibernate.engine.jdbc.spi.JdbcCoordinator; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.persister.entity.Lockable; import org.hibernate.pretty.MessageHelper; import org.hibernate.sql.SimpleSelect; +import org.hibernate.stat.spi.StatisticsImplementor; /** * A pessimistic locking strategy where the locks are obtained through select statements. @@ -54,41 +56,44 @@ public void lock(Serializable id, Object version, Object object, int timeout, Sh final String sql = determineSql( timeout ); final SessionFactoryImplementor factory = session.getFactory(); try { + final Lockable lockable = getLockable(); try { - final PreparedStatement st = session.getJdbcCoordinator().getStatementPreparer().prepareStatement( sql ); + final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator(); + final PreparedStatement st = jdbcCoordinator.getStatementPreparer().prepareStatement( sql ); try { - getLockable().getIdentifierType().nullSafeSet( st, id, 1, session ); - if ( getLockable().isVersioned() ) { - getLockable().getVersionType().nullSafeSet( + lockable.getIdentifierType().nullSafeSet( st, id, 1, session ); + if ( lockable.isVersioned() ) { + lockable.getVersionType().nullSafeSet( st, version, - getLockable().getIdentifierType().getColumnSpan( factory ) + 1, + lockable.getIdentifierType().getColumnSpan( factory ) + 1, session ); } - final ResultSet rs = session.getJdbcCoordinator().getResultSetReturn().extract( st ); + final ResultSet rs = jdbcCoordinator.getResultSetReturn().extract( st ); try { if ( !rs.next() ) { - if ( factory.getStatistics().isStatisticsEnabled() ) { - factory.getStatistics().optimisticFailure( getLockable().getEntityName() ); + final StatisticsImplementor statistics = factory.getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.optimisticFailure( lockable.getEntityName() ); } - throw new StaleObjectStateException( getLockable().getEntityName(), id ); + throw new StaleObjectStateException( lockable.getEntityName(), id ); } } finally { - session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( rs, st ); + jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( rs, st ); } } finally { - session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( st ); - session.getJdbcCoordinator().afterStatementExecution(); + jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( st ); + jdbcCoordinator.afterStatementExecution(); } } catch ( SQLException e ) { throw session.getJdbcServices().getSqlExceptionHelper().convert( e, - "could not lock: " + MessageHelper.infoString( getLockable(), id, session.getFactory() ), + "could not lock: " + MessageHelper.infoString( lockable, id, session.getFactory() ), sql ); } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticWriteUpdateLockingStrategy.java b/hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticWriteUpdateLockingStrategy.java index 1274b3b344..fa64f2f935 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticWriteUpdateLockingStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticWriteUpdateLockingStrategy.java @@ -14,12 +14,14 @@ import org.hibernate.JDBCException; import org.hibernate.LockMode; import org.hibernate.StaleObjectStateException; +import org.hibernate.engine.jdbc.spi.JdbcCoordinator; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.CoreMessageLogger; import org.hibernate.persister.entity.Lockable; import org.hibernate.pretty.MessageHelper; import org.hibernate.sql.Update; +import org.hibernate.stat.spi.StatisticsImplementor; import org.jboss.logging.Logger; @@ -74,7 +76,8 @@ public void lock(Serializable id, Object version, Object object, int timeout, Sh final SessionFactoryImplementor factory = session.getFactory(); try { try { - final PreparedStatement st = session.getJdbcCoordinator().getStatementPreparer().prepareStatement( sql ); + final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator(); + final PreparedStatement st = jdbcCoordinator.getStatementPreparer().prepareStatement( sql ); try { lockable.getVersionType().nullSafeSet( st, version, 1, session ); int offset = 2; @@ -86,19 +89,20 @@ public void lock(Serializable id, Object version, Object object, int timeout, Sh lockable.getVersionType().nullSafeSet( st, version, offset, session ); } - final int affected = session.getJdbcCoordinator().getResultSetReturn().executeUpdate( st ); + final int affected = jdbcCoordinator.getResultSetReturn().executeUpdate( st ); // todo: should this instead check for exactly one row modified? if ( affected < 0 ) { - if (factory.getStatistics().isStatisticsEnabled()) { - factory.getStatistics().optimisticFailure( lockable.getEntityName() ); + final StatisticsImplementor statistics = factory.getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.optimisticFailure( lockable.getEntityName() ); } throw new StaleObjectStateException( lockable.getEntityName(), id ); } } finally { - session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( st ); - session.getJdbcCoordinator().afterStatementExecution(); + jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( st ); + jdbcCoordinator.afterStatementExecution(); } } catch ( SQLException e ) { diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/lock/SelectLockingStrategy.java b/hibernate-core/src/main/java/org/hibernate/dialect/lock/SelectLockingStrategy.java index 61c2093813..52f7c8e48e 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/lock/SelectLockingStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/lock/SelectLockingStrategy.java @@ -15,11 +15,13 @@ import org.hibernate.LockMode; import org.hibernate.LockOptions; import org.hibernate.StaleObjectStateException; +import org.hibernate.engine.jdbc.spi.JdbcCoordinator; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.persister.entity.Lockable; import org.hibernate.pretty.MessageHelper; import org.hibernate.sql.SimpleSelect; +import org.hibernate.stat.spi.StatisticsImplementor; /** * A locking strategy where the locks are obtained through select statements. @@ -53,42 +55,45 @@ public void lock( SharedSessionContractImplementor session) throws StaleObjectStateException, JDBCException { final String sql = determineSql( timeout ); final SessionFactoryImplementor factory = session.getFactory(); + final Lockable lockable = getLockable(); try { - final PreparedStatement st = session.getJdbcCoordinator().getStatementPreparer().prepareStatement( sql ); + final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator(); + final PreparedStatement st = jdbcCoordinator.getStatementPreparer().prepareStatement( sql ); try { - getLockable().getIdentifierType().nullSafeSet( st, id, 1, session ); - if ( getLockable().isVersioned() ) { - getLockable().getVersionType().nullSafeSet( + lockable.getIdentifierType().nullSafeSet( st, id, 1, session ); + if ( lockable.isVersioned() ) { + lockable.getVersionType().nullSafeSet( st, version, - getLockable().getIdentifierType().getColumnSpan( factory ) + 1, + lockable.getIdentifierType().getColumnSpan( factory ) + 1, session ); } - final ResultSet rs = session.getJdbcCoordinator().getResultSetReturn().extract( st ); + final ResultSet rs = jdbcCoordinator.getResultSetReturn().extract( st ); try { if ( !rs.next() ) { - if ( factory.getStatistics().isStatisticsEnabled() ) { - factory.getStatistics().optimisticFailure( getLockable().getEntityName() ); + final StatisticsImplementor statistics = factory.getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.optimisticFailure( lockable.getEntityName() ); } - throw new StaleObjectStateException( getLockable().getEntityName(), id ); + throw new StaleObjectStateException( lockable.getEntityName(), id ); } } finally { - session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( rs, st ); + jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( rs, st ); } } finally { - session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( st ); - session.getJdbcCoordinator().afterStatementExecution(); + jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( st ); + jdbcCoordinator.afterStatementExecution(); } } catch ( SQLException sqle ) { throw session.getJdbcServices().getSqlExceptionHelper().convert( sqle, - "could not lock: " + MessageHelper.infoString( getLockable(), id, session.getFactory() ), + "could not lock: " + MessageHelper.infoString( lockable, id, session.getFactory() ), sql ); } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/lock/UpdateLockingStrategy.java b/hibernate-core/src/main/java/org/hibernate/dialect/lock/UpdateLockingStrategy.java index 6f002ba57f..40fe3c2632 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/lock/UpdateLockingStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/lock/UpdateLockingStrategy.java @@ -14,12 +14,16 @@ import org.hibernate.JDBCException; import org.hibernate.LockMode; import org.hibernate.StaleObjectStateException; +import org.hibernate.engine.jdbc.spi.JdbcCoordinator; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.CoreMessageLogger; import org.hibernate.persister.entity.Lockable; import org.hibernate.pretty.MessageHelper; import org.hibernate.sql.Update; +import org.hibernate.stat.spi.StatisticsImplementor; +import org.hibernate.type.Type; +import org.hibernate.type.VersionType; import org.jboss.logging.Logger; @@ -70,37 +74,42 @@ public void lock( Object object, int timeout, SharedSessionContractImplementor session) throws StaleObjectStateException, JDBCException { + final String lockableEntityName = lockable.getEntityName(); if ( !lockable.isVersioned() ) { - throw new HibernateException( "write locks via update not supported for non-versioned entities [" + lockable.getEntityName() + "]" ); + throw new HibernateException( "write locks via update not supported for non-versioned entities [" + lockableEntityName + "]" ); } // todo : should we additionally check the current isolation mode explicitly? final SessionFactoryImplementor factory = session.getFactory(); try { - final PreparedStatement st = session.getJdbcCoordinator().getStatementPreparer().prepareStatement( sql ); + final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator(); + final PreparedStatement st = jdbcCoordinator.getStatementPreparer().prepareStatement( sql ); try { - lockable.getVersionType().nullSafeSet( st, version, 1, session ); + final VersionType lockableVersionType = lockable.getVersionType(); + lockableVersionType.nullSafeSet( st, version, 1, session ); int offset = 2; - lockable.getIdentifierType().nullSafeSet( st, id, offset, session ); - offset += lockable.getIdentifierType().getColumnSpan( factory ); + final Type lockableIdentifierType = lockable.getIdentifierType(); + lockableIdentifierType.nullSafeSet( st, id, offset, session ); + offset += lockableIdentifierType.getColumnSpan( factory ); if ( lockable.isVersioned() ) { - lockable.getVersionType().nullSafeSet( st, version, offset, session ); + lockableVersionType.nullSafeSet( st, version, offset, session ); } - final int affected = session.getJdbcCoordinator().getResultSetReturn().executeUpdate( st ); + final int affected = jdbcCoordinator.getResultSetReturn().executeUpdate( st ); if ( affected < 0 ) { - if (factory.getStatistics().isStatisticsEnabled()) { - factory.getStatistics().optimisticFailure( lockable.getEntityName() ); + final StatisticsImplementor statistics = factory.getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.optimisticFailure( lockableEntityName ); } - throw new StaleObjectStateException( lockable.getEntityName(), id ); + throw new StaleObjectStateException( lockableEntityName, id ); } } finally { - session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( st ); - session.getJdbcCoordinator().afterStatementExecution(); + jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( st ); + jdbcCoordinator.afterStatementExecution(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/internal/NaturalIdXrefDelegate.java b/hibernate-core/src/main/java/org/hibernate/engine/internal/NaturalIdXrefDelegate.java index 7a975e9d59..71233928bf 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/internal/NaturalIdXrefDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/internal/NaturalIdXrefDelegate.java @@ -21,6 +21,7 @@ import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.stat.internal.StatsHelper; +import org.hibernate.stat.spi.StatisticsImplementor; import org.hibernate.type.Type; import org.jboss.logging.Logger; @@ -240,15 +241,20 @@ public Serializable findCachedNaturalIdResolution(EntityPersister persister, Obj // Try resolution from second-level cache final NaturalIdDataAccess naturalIdCacheAccessStrategy = persister.getNaturalIdCacheAccessStrategy(); - final Object naturalIdCacheKey = naturalIdCacheAccessStrategy.generateCacheKey( naturalIdValues, persister, session() ); + final SharedSessionContractImplementor session = session(); + final Object naturalIdCacheKey = naturalIdCacheAccessStrategy.generateCacheKey( naturalIdValues, persister, + session + ); - pk = CacheHelper.fromSharedCache( session(), naturalIdCacheKey, naturalIdCacheAccessStrategy ); + pk = CacheHelper.fromSharedCache( session, naturalIdCacheKey, naturalIdCacheAccessStrategy ); // Found in second-level cache, store in session cache - final SessionFactoryImplementor factory = session().getFactory(); + final SessionFactoryImplementor factory = session.getFactory(); + final StatisticsImplementor statistics = factory.getStatistics(); + final boolean statisticsEnabled = statistics.isStatisticsEnabled(); if ( pk != null ) { - if ( factory.getStatistics().isStatisticsEnabled() ) { - factory.getStatistics().naturalIdCacheHit( + if ( statisticsEnabled ) { + statistics.naturalIdCacheHit( StatsHelper.INSTANCE.getRootEntityRole( persister ), naturalIdCacheAccessStrategy.getRegion().getName() ); @@ -275,8 +281,8 @@ public Serializable findCachedNaturalIdResolution(EntityPersister persister, Obj entityNaturalIdResolutionCache.pkToNaturalIdMap.put( pk, cachedNaturalId ); entityNaturalIdResolutionCache.naturalIdToPkMap.put( cachedNaturalId, pk ); } - else if ( factory.getStatistics().isStatisticsEnabled() ) { - factory.getStatistics().naturalIdCacheMiss( + else if ( statisticsEnabled ) { + statistics.naturalIdCacheMiss( StatsHelper.INSTANCE.getRootEntityRole( persister ), naturalIdCacheAccessStrategy.getRegion().getName() ); diff --git a/hibernate-core/src/main/java/org/hibernate/engine/internal/StatefulPersistenceContext.java b/hibernate-core/src/main/java/org/hibernate/engine/internal/StatefulPersistenceContext.java index d62c5040ec..b071c9a9f7 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/internal/StatefulPersistenceContext.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/internal/StatefulPersistenceContext.java @@ -64,6 +64,7 @@ import org.hibernate.proxy.HibernateProxy; import org.hibernate.proxy.LazyInitializer; import org.hibernate.stat.internal.StatsHelper; +import org.hibernate.stat.spi.StatisticsImplementor; import org.hibernate.type.CollectionType; import org.jboss.logging.Logger; @@ -1810,6 +1811,7 @@ private void managedSharedCacheEntries( final Object naturalIdCacheKey = naturalIdCacheAccessStrategy.generateCacheKey( naturalIdValues, persister, session ); final SessionFactoryImplementor factory = session.getFactory(); + final StatisticsImplementor statistics = factory.getStatistics(); switch ( source ) { case LOAD: { @@ -1824,8 +1826,8 @@ private void managedSharedCacheEntries( null ); - if ( put && factory.getStatistics().isStatisticsEnabled() ) { - factory.getStatistics().naturalIdCachePut( + if ( put && statistics.isStatisticsEnabled() ) { + statistics.naturalIdCachePut( StatsHelper.INSTANCE.getRootEntityRole( persister ), naturalIdCacheAccessStrategy.getRegion().getName() ); @@ -1835,8 +1837,8 @@ private void managedSharedCacheEntries( } case INSERT: { final boolean put = naturalIdCacheAccessStrategy.insert( session, naturalIdCacheKey, id ); - if ( put && factory.getStatistics().isStatisticsEnabled() ) { - factory.getStatistics().naturalIdCachePut( + if ( put && statistics.isStatisticsEnabled() ) { + statistics.naturalIdCachePut( StatsHelper.INSTANCE.getRootEntityRole( persister ), naturalIdCacheAccessStrategy.getRegion().getName() ); @@ -1848,8 +1850,8 @@ private void managedSharedCacheEntries( public void doAfterTransactionCompletion(boolean success, SharedSessionContractImplementor session) { if (success) { final boolean put = naturalIdCacheAccessStrategy.afterInsert( session, naturalIdCacheKey, id ); - if ( put && factory.getStatistics().isStatisticsEnabled() ) { - factory.getStatistics().naturalIdCachePut( + if ( put && statistics.isStatisticsEnabled() ) { + statistics.naturalIdCachePut( StatsHelper.INSTANCE.getRootEntityRole( persister ), naturalIdCacheAccessStrategy.getRegion().getName() ); @@ -1875,8 +1877,8 @@ public void doAfterTransactionCompletion(boolean success, SharedSessionContractI final SoftLock lock = naturalIdCacheAccessStrategy.lockItem( session, naturalIdCacheKey, null ); final boolean put = naturalIdCacheAccessStrategy.update( session, naturalIdCacheKey, id ); - if ( put && factory.getStatistics().isStatisticsEnabled() ) { - factory.getStatistics().naturalIdCachePut( + if ( put && statistics.isStatisticsEnabled() ) { + statistics.naturalIdCachePut( StatsHelper.INSTANCE.getRootEntityRole( persister ), naturalIdCacheAccessStrategy.getRegion().getName() ); @@ -1895,8 +1897,8 @@ public void doAfterTransactionCompletion(boolean success, SharedSessionContractI lock ); - if ( put && factory.getStatistics().isStatisticsEnabled() ) { - factory.getStatistics().naturalIdCachePut( + if ( put && statistics.isStatisticsEnabled() ) { + statistics.naturalIdCachePut( StatsHelper.INSTANCE.getRootEntityRole( persister ), naturalIdCacheAccessStrategy.getRegion().getName() ); diff --git a/hibernate-core/src/main/java/org/hibernate/engine/internal/TwoPhaseLoad.java b/hibernate-core/src/main/java/org/hibernate/engine/internal/TwoPhaseLoad.java index 035af361fe..9e17b8f7f3 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/internal/TwoPhaseLoad.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/internal/TwoPhaseLoad.java @@ -477,8 +477,9 @@ private static boolean useMinimalPuts(SharedSessionContractImplementor session, return session.getCacheMode() != CacheMode.REFRESH; } else { - return entityEntry.getPersister().hasLazyProperties() - && entityEntry.getPersister().isLazyPropertiesCacheable(); + final EntityPersister persister = entityEntry.getPersister(); + return persister.hasLazyProperties() + && persister.isLazyPropertiesCacheable(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/loading/internal/CollectionLoadContext.java b/hibernate-core/src/main/java/org/hibernate/engine/loading/internal/CollectionLoadContext.java index 89e76820f7..e735022662 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/loading/internal/CollectionLoadContext.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/loading/internal/CollectionLoadContext.java @@ -24,6 +24,7 @@ import org.hibernate.engine.spi.CollectionEntry; import org.hibernate.engine.spi.CollectionKey; import org.hibernate.engine.spi.PersistenceContext; +import org.hibernate.engine.spi.SessionEventListenerManager; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.engine.spi.Status; @@ -34,6 +35,7 @@ import org.hibernate.persister.collection.QueryableCollection; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.pretty.MessageHelper; +import org.hibernate.stat.spi.StatisticsImplementor; /** * Represents state associated with the processing of a given {@link ResultSet} @@ -229,21 +231,23 @@ private void endLoadingCollections(CollectionPersister persister, List 1) { // not the best place for doing this, moved into ce.postInitialize // getLoadContext().getPersistenceContext().getBatchFetchQueue().removeBatchLoadableCollection(ce); // } @@ -251,31 +255,32 @@ private void endLoadingCollection(LoadingCollectionEntry lce, CollectionPersiste // The collection has been completely initialized and added to the PersistenceContext. - if ( lce.getCollection().getOwner() != null ) { + if ( loadingCollection.getOwner() != null ) { // If the owner is bytecode-enhanced and the owner's collection value is uninitialized, // then go ahead and set it to the newly initialized collection. + final EntityPersister ownerEntityPersister = persister.getOwnerEntityPersister(); final BytecodeEnhancementMetadata bytecodeEnhancementMetadata = - persister.getOwnerEntityPersister().getBytecodeEnhancementMetadata(); + ownerEntityPersister.getBytecodeEnhancementMetadata(); if ( bytecodeEnhancementMetadata.isEnhancedForLazyLoading() ) { // Lazy properties in embeddables/composites are not currently supported for embeddables (HHH-10480), // so check to make sure the collection is not in an embeddable before checking to see if // the collection is lazy. // TODO: More will probably need to be done here when HHH-10480 is fixed.. if ( StringHelper.qualifier( persister.getRole() ).length() == - persister.getOwnerEntityPersister().getEntityName().length() ) { + ownerEntityPersister.getEntityName().length() ) { // Assume the collection is not in an embeddable. // Strip off to get the collection property name. final String propertyName = persister.getRole().substring( - persister.getOwnerEntityPersister().getEntityName().length() + 1 + ownerEntityPersister.getEntityName().length() + 1 ); - if ( !bytecodeEnhancementMetadata.isAttributeLoaded( lce.getCollection().getOwner(), propertyName ) ) { - int propertyIndex = persister.getOwnerEntityPersister().getEntityMetamodel().getPropertyIndex( + if ( !bytecodeEnhancementMetadata.isAttributeLoaded( loadingCollection.getOwner(), propertyName ) ) { + int propertyIndex = ownerEntityPersister.getEntityMetamodel().getPropertyIndex( propertyName ); - persister.getOwnerEntityPersister().setPropertyValue( - lce.getCollection().getOwner(), + ownerEntityPersister.setPropertyValue( + loadingCollection.getOwner(), propertyIndex, - lce.getCollection() + loadingCollection ); } } @@ -297,11 +302,12 @@ private void endLoadingCollection(LoadingCollectionEntry lce, CollectionPersiste if ( LOG.isDebugEnabled() ) { LOG.debugf( "Collection fully initialized: %s", - MessageHelper.collectionInfoString( persister, lce.getCollection(), lce.getKey(), session ) + MessageHelper.collectionInfoString( persister, loadingCollection, lce.getKey(), session ) ); } - if ( session.getFactory().getStatistics().isStatisticsEnabled() ) { - session.getFactory().getStatistics().loadCollection( persister.getRole() ); + final StatisticsImplementor statistics = session.getFactory().getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.loadCollection( persister.getRole() ); } } @@ -384,8 +390,9 @@ private void addCollectionToCache(LoadingCollectionEntry lce, CollectionPersiste // CollectionRegionAccessStrategy has no update, so avoid putting uncommitted data via putFromLoad if (isPutFromLoad) { + final SessionEventListenerManager eventListenerManager = session.getEventListenerManager(); try { - session.getEventListenerManager().cachePutStart(); + eventListenerManager.cachePutStart(); final boolean put = cacheAccess.putFromLoad( session, cacheKey, @@ -394,15 +401,16 @@ private void addCollectionToCache(LoadingCollectionEntry lce, CollectionPersiste factory.getSessionFactoryOptions().isMinimalPutsEnabled() && session.getCacheMode()!= CacheMode.REFRESH ); - if ( put && factory.getStatistics().isStatisticsEnabled() ) { - factory.getStatistics().collectionCachePut( + final StatisticsImplementor statistics = factory.getStatistics(); + if ( put && statistics.isStatisticsEnabled() ) { + statistics.collectionCachePut( persister.getNavigableRole(), persister.getCacheAccessStrategy().getRegion().getName() ); } } finally { - session.getEventListenerManager().cachePutEnd(); + eventListenerManager.cachePutEnd(); } } } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/query/spi/QueryPlanCache.java b/hibernate-core/src/main/java/org/hibernate/engine/query/spi/QueryPlanCache.java index c633ac9a8f..9eb1504756 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/query/spi/QueryPlanCache.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/query/spi/QueryPlanCache.java @@ -29,6 +29,7 @@ import org.hibernate.internal.util.config.ConfigurationHelper; import org.hibernate.query.ParameterMetadata; import org.hibernate.query.internal.ParameterMetadataImpl; +import org.hibernate.stat.spi.StatisticsImplementor; /** * Acts as a cache for compiled query plans, as well as query-parameter metadata. @@ -149,7 +150,8 @@ public HQLQueryPlan getHQLQueryPlan(String queryString, boolean shallow, Map parameters = filter.getParameters(); + if ( parameters.isEmpty() ) { parameterMetadata = Collections.emptyMap(); } else { parameterMetadata = new HashMap( - CollectionHelper.determineProperSizing( filter.getParameters() ), + CollectionHelper.determineProperSizing( parameters ), CollectionHelper.LOAD_FACTOR ); - for ( Object o : filter.getParameters().entrySet() ) { + for ( Object o : parameters.entrySet() ) { final Map.Entry entry = (Map.Entry) o; final String key = (String) entry.getKey(); final Integer valueCount; diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultAutoFlushEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultAutoFlushEventListener.java index 1ec58e3366..365a010bee 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultAutoFlushEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultAutoFlushEventListener.java @@ -8,11 +8,14 @@ import org.hibernate.FlushMode; import org.hibernate.HibernateException; +import org.hibernate.engine.spi.ActionQueue; import org.hibernate.engine.spi.PersistenceContext; +import org.hibernate.engine.spi.SessionEventListenerManager; import org.hibernate.event.spi.AutoFlushEvent; import org.hibernate.event.spi.AutoFlushEventListener; import org.hibernate.event.spi.EventSource; import org.hibernate.internal.CoreMessageLogger; +import org.hibernate.stat.spi.StatisticsImplementor; import org.jboss.logging.Logger; @@ -35,38 +38,41 @@ public class DefaultAutoFlushEventListener extends AbstractFlushingEventListener */ public void onAutoFlush(AutoFlushEvent event) throws HibernateException { final EventSource source = event.getSession(); + final SessionEventListenerManager eventListenerManager = source.getEventListenerManager(); try { - source.getEventListenerManager().partialFlushStart(); + eventListenerManager.partialFlushStart(); - if ( flushMightBeNeeded(source) ) { + if ( flushMightBeNeeded( source ) ) { // Need to get the number of collection removals before flushing to executions // (because flushing to executions can add collection removal actions to the action queue). - final int oldSize = source.getActionQueue().numberOfCollectionRemovals(); - flushEverythingToExecutions(event); - if ( flushIsReallyNeeded(event, source) ) { + final ActionQueue actionQueue = source.getActionQueue(); + final int oldSize = actionQueue.numberOfCollectionRemovals(); + flushEverythingToExecutions( event ); + if ( flushIsReallyNeeded( event, source ) ) { LOG.trace( "Need to execute flush" ); // note: performExecutions() clears all collectionXxxxtion // collections (the collection actions) in the session - performExecutions(source); - postFlush(source); + performExecutions( source ); + postFlush( source ); postPostFlush( source ); - if ( source.getFactory().getStatistics().isStatisticsEnabled() ) { - source.getFactory().getStatistics().flush(); + final StatisticsImplementor statistics = source.getFactory().getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.flush(); } } else { LOG.trace( "Don't need to execute flush" ); - source.getActionQueue().clearFromFlushNeededCheck( oldSize ); + actionQueue.clearFromFlushNeededCheck( oldSize ); } event.setFlushRequired( flushIsReallyNeeded( event, source ) ); } } finally { - source.getEventListenerManager().partialFlushEnd( + eventListenerManager.partialFlushEnd( event.getNumberOfEntitiesProcessed(), event.getNumberOfEntitiesProcessed() ); diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultInitializeCollectionEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultInitializeCollectionEventListener.java index a7ba1f0a2f..31263923e0 100755 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultInitializeCollectionEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultInitializeCollectionEventListener.java @@ -43,11 +43,12 @@ public void onInitializeCollection(InitializeCollectionEvent event) throws Hiber throw new HibernateException( "collection was evicted" ); } if ( !collection.wasInitialized() ) { + final CollectionPersister ceLoadedPersister = ce.getLoadedPersister(); if ( LOG.isTraceEnabled() ) { LOG.tracev( "Initializing collection {0}", MessageHelper.collectionInfoString( - ce.getLoadedPersister(), + ceLoadedPersister, collection, ce.getLoadedKey(), source @@ -58,7 +59,7 @@ public void onInitializeCollection(InitializeCollectionEvent event) throws Hiber final boolean foundInCache = initializeCollectionFromCache( ce.getLoadedKey(), - ce.getLoadedPersister(), + ceLoadedPersister, collection, source ); @@ -72,7 +73,7 @@ public void onInitializeCollection(InitializeCollectionEvent event) throws Hiber if ( LOG.isTraceEnabled() ) { LOG.trace( "Collection not cached" ); } - ce.getLoadedPersister().initialize( ce.getLoadedKey(), source ); + ceLoadedPersister.initialize( ce.getLoadedKey(), source ); if ( LOG.isTraceEnabled() ) { LOG.trace( "Collection initialized" ); } @@ -80,7 +81,7 @@ public void onInitializeCollection(InitializeCollectionEvent event) throws Hiber final StatisticsImplementor statistics = source.getFactory().getStatistics(); if ( statistics.isStatisticsEnabled() ) { statistics.fetchCollection( - ce.getLoadedPersister().getRole() + ceLoadedPersister.getRole() ); } } @@ -119,7 +120,7 @@ private boolean initializeCollectionFromCache( final SessionFactoryImplementor factory = source.getFactory(); final CollectionDataAccess cacheAccessStrategy = persister.getCacheAccessStrategy(); final Object ck = cacheAccessStrategy.generateCacheKey( id, persister, factory, source.getTenantIdentifier() ); - final Object ce = CacheHelper.fromSharedCache( source, ck, persister.getCacheAccessStrategy() ); + final Object ce = CacheHelper.fromSharedCache( source, ck, cacheAccessStrategy ); final StatisticsImplementor statistics = factory.getStatistics(); if ( statistics.isStatisticsEnabled() ) { 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 0b58ac9136..56326d172a 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 @@ -38,6 +38,7 @@ import org.hibernate.proxy.HibernateProxy; import org.hibernate.proxy.LazyInitializer; import org.hibernate.service.ServiceRegistry; +import org.hibernate.stat.spi.StatisticsImplementor; import org.hibernate.type.ForeignKeyDirection; import org.hibernate.type.TypeHelper; @@ -333,8 +334,9 @@ else if ( !source.getEntityName( target ).equals( entityName ) ) { ); } else if ( isVersionChanged( entity, source, persister, target ) ) { - if ( source.getFactory().getStatistics().isStatisticsEnabled() ) { - source.getFactory().getStatistics().optimisticFailure( entityName ); + final StatisticsImplementor statistics = source.getFactory().getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.optimisticFailure( entityName ); } throw new StaleObjectStateException( entityName, id ); } diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultResolveNaturalIdEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultResolveNaturalIdEventListener.java index 4767a2ea11..e1c856cb32 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultResolveNaturalIdEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultResolveNaturalIdEventListener.java @@ -20,6 +20,7 @@ import org.hibernate.internal.CoreMessageLogger; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.pretty.MessageHelper; +import org.hibernate.stat.spi.StatisticsImplementor; /** * Defines the default load event listeners used by hibernate for loading entities @@ -112,7 +113,8 @@ protected Serializable resolveFromCache(final ResolveNaturalIdEvent event) { protected Serializable loadFromDatasource(final ResolveNaturalIdEvent event) { final EventSource session = event.getSession(); final SessionFactoryImplementor factory = session.getFactory(); - final boolean stats = factory.getStatistics().isStatisticsEnabled(); + final StatisticsImplementor statistics = factory.getStatistics(); + final boolean stats = statistics.isStatisticsEnabled(); long startTime = 0; if ( stats ) { startTime = System.nanoTime(); @@ -127,7 +129,7 @@ protected Serializable loadFromDatasource(final ResolveNaturalIdEvent event) { if ( stats ) { final long endTime = System.nanoTime(); final long milliseconds = TimeUnit.MILLISECONDS.convert( endTime - startTime, TimeUnit.NANOSECONDS ); - factory.getStatistics().naturalIdQueryExecuted( + statistics.naturalIdQueryExecuted( event.getEntityPersister().getRootEntityName(), milliseconds ); diff --git a/hibernate-core/src/main/java/org/hibernate/exception/spi/SQLExceptionConverterFactory.java b/hibernate-core/src/main/java/org/hibernate/exception/spi/SQLExceptionConverterFactory.java index ca5917a4f3..6a75596fe0 100644 --- a/hibernate-core/src/main/java/org/hibernate/exception/spi/SQLExceptionConverterFactory.java +++ b/hibernate-core/src/main/java/org/hibernate/exception/spi/SQLExceptionConverterFactory.java @@ -94,8 +94,9 @@ private static SQLExceptionConverter constructConverter(String converterClassNam // First, try to find a matching constructor accepting a ViolatedConstraintNameExtracter param... final Constructor[] ctors = converterClass.getDeclaredConstructors(); for ( Constructor ctor : ctors ) { - if ( ctor.getParameterTypes() != null && ctor.getParameterCount() == 1 ) { - if ( ViolatedConstraintNameExtracter.class.isAssignableFrom( ctor.getParameterTypes()[0] ) ) { + final Class[] parameterTypes = ctor.getParameterTypes(); + if ( parameterTypes != null && ctor.getParameterCount() == 1 ) { + if ( ViolatedConstraintNameExtracter.class.isAssignableFrom( parameterTypes[0] ) ) { try { return (SQLExceptionConverter) ctor.newInstance( violatedConstraintNameExtracter ); } diff --git a/hibernate-core/src/main/java/org/hibernate/hql/internal/classic/QueryTranslatorImpl.java b/hibernate-core/src/main/java/org/hibernate/hql/internal/classic/QueryTranslatorImpl.java index b6c203cd49..7f4432e1f6 100644 --- a/hibernate-core/src/main/java/org/hibernate/hql/internal/classic/QueryTranslatorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/hql/internal/classic/QueryTranslatorImpl.java @@ -62,6 +62,7 @@ import org.hibernate.sql.JoinFragment; import org.hibernate.sql.JoinType; import org.hibernate.sql.QuerySelect; +import org.hibernate.stat.spi.StatisticsImplementor; import org.hibernate.transform.ResultTransformer; import org.hibernate.type.AssociationType; import org.hibernate.type.EntityType; @@ -1045,7 +1046,8 @@ public List list(SharedSessionContractImplementor session, QueryParameters query public Iterator iterate(QueryParameters queryParameters, EventSource session) throws HibernateException { - boolean stats = session.getFactory().getStatistics().isStatisticsEnabled(); + final StatisticsImplementor statistics = session.getFactory().getStatistics(); + boolean stats = statistics.isStatisticsEnabled(); long startTime = 0; if ( stats ) { startTime = System.nanoTime(); @@ -1078,7 +1080,7 @@ public Iterator iterate(QueryParameters queryParameters, EventSource session) if ( stats ) { final long endTime = System.nanoTime(); final long milliseconds = TimeUnit.MILLISECONDS.convert( endTime - startTime, TimeUnit.NANOSECONDS ); - session.getFactory().getStatistics().queryExecuted( + statistics.queryExecuted( "HQL: " + queryString, 0, milliseconds diff --git a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/inline/AbstractInlineIdsUpdateHandlerImpl.java b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/inline/AbstractInlineIdsUpdateHandlerImpl.java index 4c54dce3e5..5086fb132d 100644 --- a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/inline/AbstractInlineIdsUpdateHandlerImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/inline/AbstractInlineIdsUpdateHandlerImpl.java @@ -14,6 +14,7 @@ import java.util.List; import java.util.Map; +import org.hibernate.engine.jdbc.spi.JdbcCoordinator; import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.spi.QueryParameters; import org.hibernate.engine.spi.SessionFactoryImplementor; @@ -22,6 +23,7 @@ import org.hibernate.hql.internal.ast.tree.AssignmentSpecification; import org.hibernate.hql.spi.id.MultiTableBulkIdStrategy; import org.hibernate.param.ParameterSpecification; +import org.hibernate.persister.entity.Queryable; import org.hibernate.sql.Update; /** @@ -57,8 +59,9 @@ public int execute( if ( !values.getIds().isEmpty() ) { - String[] tableNames = getTargetedQueryable().getConstraintOrderedTableNameClosure(); - String[][] columnNames = getTargetedQueryable().getContraintOrderedTableKeyColumnClosure(); + final Queryable targetedQueryable = getTargetedQueryable(); + String[] tableNames = targetedQueryable.getConstraintOrderedTableNameClosure(); + String[][] columnNames = targetedQueryable.getContraintOrderedTableKeyColumnClosure(); String idSubselect = values.toStatement(); @@ -85,6 +88,8 @@ public int execute( } } + final JdbcCoordinator jdbcCoordinator = session + .getJdbcCoordinator(); // Start performing the updates for ( Map.Entry updateEntry: updates.entrySet()) { int i = updateEntry.getKey(); @@ -94,8 +99,7 @@ public int execute( continue; } try { - try (PreparedStatement ps = session - .getJdbcCoordinator().getStatementPreparer() + try (PreparedStatement ps = jdbcCoordinator.getStatementPreparer() .prepareStatement( update, false )) { int position = 1; // jdbc params are 1-based if ( assignmentParameterSpecifications[i] != null ) { @@ -104,8 +108,7 @@ public int execute( .bind( ps, queryParameters, session, position ); } } - session - .getJdbcCoordinator().getResultSetReturn() + jdbcCoordinator.getResultSetReturn() .executeUpdate( ps ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractReturningDelegate.java b/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractReturningDelegate.java index 93e3725e11..7bfcb7e525 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractReturningDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractReturningDelegate.java @@ -10,6 +10,7 @@ import java.sql.PreparedStatement; import java.sql.SQLException; +import org.hibernate.engine.jdbc.spi.JdbcCoordinator; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.id.PostInsertIdentityPersister; import org.hibernate.pretty.MessageHelper; @@ -63,8 +64,9 @@ protected PostInsertIdentityPersister getPersister() { protected abstract Serializable executeAndExtract(PreparedStatement insert, SharedSessionContractImplementor session) throws SQLException; - protected void releaseStatement(PreparedStatement insert, SharedSessionContractImplementor session) throws SQLException { - session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( insert ); - session.getJdbcCoordinator().afterStatementExecution(); + protected void releaseStatement(PreparedStatement insert, SharedSessionContractImplementor session) { + final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator(); + jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( insert ); + jdbcCoordinator.afterStatementExecution(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/internal/ConnectionObserverStatsBridge.java b/hibernate-core/src/main/java/org/hibernate/internal/ConnectionObserverStatsBridge.java index 3873444cf3..0c9d4f79c6 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/ConnectionObserverStatsBridge.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/ConnectionObserverStatsBridge.java @@ -11,6 +11,7 @@ import org.hibernate.engine.jdbc.spi.ConnectionObserver; import org.hibernate.engine.spi.SessionFactoryImplementor; +import org.hibernate.stat.spi.StatisticsImplementor; /** * @author Steve Ebersole @@ -24,8 +25,9 @@ public ConnectionObserverStatsBridge(SessionFactoryImplementor sessionFactory) { @Override public void physicalConnectionObtained(Connection connection) { - if ( sessionFactory.getStatistics().isStatisticsEnabled() ) { - sessionFactory.getStatistics().connect(); + final StatisticsImplementor statistics = sessionFactory.getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.connect(); } } @@ -39,8 +41,9 @@ public void logicalConnectionClosed() { @Override public void statementPrepared() { - if ( sessionFactory.getStatistics().isStatisticsEnabled() ) { - sessionFactory.getStatistics().prepareStatement(); + final StatisticsImplementor statistics = sessionFactory.getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.prepareStatement(); } } } diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java index 6bc7a6346d..0d15a94be4 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java @@ -19,6 +19,7 @@ import java.util.Map; import java.util.Set; import java.util.TimeZone; +import java.util.function.Supplier; import javax.naming.Reference; import javax.naming.StringRefAddr; import javax.persistence.EntityGraph; @@ -79,6 +80,7 @@ import org.hibernate.engine.spi.NamedSQLQueryDefinition; import org.hibernate.engine.spi.NamedSQLQueryDefinitionBuilder; import org.hibernate.engine.spi.SessionBuilderImplementor; +import org.hibernate.engine.spi.SessionEventListenerManager; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SessionOwner; import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform; @@ -1110,30 +1112,33 @@ public static Interceptor configuredInterceptor(Interceptor interceptor, Session } // prefer the SF-scoped interceptor, prefer that to any Session-scoped interceptor prototype - if ( options.getInterceptor() != null && options.getInterceptor() != EmptyInterceptor.INSTANCE ) { - return options.getInterceptor(); + final Interceptor optionsInterceptor = options.getInterceptor(); + if ( optionsInterceptor != null && optionsInterceptor != EmptyInterceptor.INSTANCE ) { + return optionsInterceptor; } // then check the Session-scoped interceptor prototype - if ( options.getStatelessInterceptorImplementor() != null && options.getStatelessInterceptorImplementorSupplier() != null ) { + final Class statelessInterceptorImplementor = options.getStatelessInterceptorImplementor(); + final Supplier statelessInterceptorImplementorSupplier = options.getStatelessInterceptorImplementorSupplier(); + if ( statelessInterceptorImplementor != null && statelessInterceptorImplementorSupplier != null ) { throw new HibernateException( "A session scoped interceptor class or supplier are allowed, but not both!" ); } - else if ( options.getStatelessInterceptorImplementor() != null ) { + else if ( statelessInterceptorImplementor != null ) { try { /** * We could remove the getStatelessInterceptorImplementor method and use just the getStatelessInterceptorImplementorSupplier * since it can cover both cases when the user has given a Supplier or just the * Class, in which case, we simply instantiate the Interceptor when calling the Supplier. */ - return options.getStatelessInterceptorImplementor().newInstance(); + return statelessInterceptorImplementor.newInstance(); } catch (InstantiationException | IllegalAccessException e) { throw new HibernateException( "Could not supply session-scoped SessionFactory Interceptor", e ); } } - else if ( options.getStatelessInterceptorImplementorSupplier() != null ) { - return options.getStatelessInterceptorImplementorSupplier().get(); + else if ( statelessInterceptorImplementorSupplier != null ) { + return statelessInterceptorImplementorSupplier.get(); } return null; @@ -1167,20 +1172,22 @@ static class SessionBuilderImpl implements SessionBuil this.sessionOwner = null; // set up default builder values... - this.statementInspector = sessionFactory.getSessionFactoryOptions().getStatementInspector(); - this.connectionHandlingMode = sessionFactory.getSessionFactoryOptions().getPhysicalConnectionHandlingMode(); - this.autoClose = sessionFactory.getSessionFactoryOptions().isAutoCloseSessionEnabled(); - this.flushMode = sessionFactory.getSessionFactoryOptions().isFlushBeforeCompletionEnabled() + final SessionFactoryOptions sessionFactoryOptions = sessionFactory.getSessionFactoryOptions(); + this.statementInspector = sessionFactoryOptions.getStatementInspector(); + this.connectionHandlingMode = sessionFactoryOptions.getPhysicalConnectionHandlingMode(); + this.autoClose = sessionFactoryOptions.isAutoCloseSessionEnabled(); + this.flushMode = sessionFactoryOptions.isFlushBeforeCompletionEnabled() ? FlushMode.AUTO : FlushMode.MANUAL; - if ( sessionFactory.getCurrentTenantIdentifierResolver() != null ) { - tenantIdentifier = sessionFactory.getCurrentTenantIdentifierResolver().resolveCurrentTenantIdentifier(); + final CurrentTenantIdentifierResolver currentTenantIdentifierResolver = sessionFactory.getCurrentTenantIdentifierResolver(); + if ( currentTenantIdentifierResolver != null ) { + tenantIdentifier = currentTenantIdentifierResolver.resolveCurrentTenantIdentifier(); } - this.jdbcTimeZone = sessionFactory.getSessionFactoryOptions().getJdbcTimeZone(); + this.jdbcTimeZone = sessionFactoryOptions.getJdbcTimeZone(); - listeners = sessionFactory.getSessionFactoryOptions().getBaselineSessionEventsListenerBuilder().buildBaselineList(); - queryParametersValidationEnabled = sessionFactory.getSessionFactoryOptions().isQueryParametersValidationEnabled(); + listeners = sessionFactoryOptions.getBaselineSessionEventsListenerBuilder().buildBaselineList(); + queryParametersValidationEnabled = sessionFactoryOptions.isQueryParametersValidationEnabled(); } @@ -1287,8 +1294,9 @@ public Session openSession() { log.tracef( "Opening Hibernate Session. tenant=%s, owner=%s", tenantIdentifier, sessionOwner ); final SessionImpl session = new SessionImpl( sessionFactory, this ); + final SessionEventListenerManager eventListenerManager = session.getEventListenerManager(); for ( SessionEventListener listener : listeners ) { - session.getEventListenerManager().addListener( listener ); + eventListenerManager.addListener( listener ); } return session; diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java index 508a2ef85c..03766a2ae4 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java @@ -178,6 +178,7 @@ import org.hibernate.resource.transaction.spi.TransactionStatus; import org.hibernate.stat.SessionStatistics; import org.hibernate.stat.internal.SessionStatisticsImpl; +import org.hibernate.stat.spi.StatisticsImplementor; import static org.hibernate.cfg.AvailableSettings.JPA_LOCK_SCOPE; import static org.hibernate.cfg.AvailableSettings.JPA_LOCK_TIMEOUT; @@ -257,19 +258,24 @@ public SessionImpl(SessionFactoryImpl factory, SessionCreationOptions options) { this.autoClose = options.shouldAutoClose(); this.queryParametersValidationEnabled = options.isQueryParametersValidationEnabled(); - this.discardOnClose = getFactory().getSessionFactoryOptions().isReleaseResourcesOnCloseEnabled(); + this.discardOnClose = factory.getSessionFactoryOptions().isReleaseResourcesOnCloseEnabled(); - if ( options instanceof SharedSessionCreationOptions && ( (SharedSessionCreationOptions) options ).isTransactionCoordinatorShared() ) { + if ( options instanceof SharedSessionCreationOptions ) { final SharedSessionCreationOptions sharedOptions = (SharedSessionCreationOptions) options; - if ( sharedOptions.getTransactionCompletionProcesses() != null ) { - actionQueue.setTransactionCompletionProcesses( sharedOptions.getTransactionCompletionProcesses(), true ); + final ActionQueue.TransactionCompletionProcesses transactionCompletionProcesses = sharedOptions.getTransactionCompletionProcesses(); + if ( sharedOptions.isTransactionCoordinatorShared() && transactionCompletionProcesses != null ) { + actionQueue.setTransactionCompletionProcesses( + transactionCompletionProcesses, + true + ); } } loadQueryInfluencers = new LoadQueryInfluencers( factory ); - if ( getFactory().getStatistics().isStatisticsEnabled() ) { - getFactory().getStatistics().openSession(); + final StatisticsImplementor statistics = factory.getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.openSession(); } // NOTE : pulse() already handles auto-join-ability correctly @@ -418,7 +424,8 @@ public void closeWithoutOpenChecks() throws HibernateException { } // todo : we want this check if usage is JPA, but not native Hibernate usage - if ( getSessionFactory().getSessionFactoryOptions().isJpaBootstrap() ) { + final SessionFactoryImplementor sessionFactory = getSessionFactory(); + if ( sessionFactory.getSessionFactoryOptions().isJpaBootstrap() ) { // Original hibernate-entitymanager EM#close behavior checkSessionFactoryOpen(); checkOpenOrWaitingForAutoClose(); @@ -435,8 +442,9 @@ public void closeWithoutOpenChecks() throws HibernateException { super.close(); } - if ( getFactory().getStatistics().isStatisticsEnabled() ) { - getFactory().getStatistics().closeSession(); + final StatisticsImplementor statistics = sessionFactory.getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.closeSession(); } } @@ -2572,8 +2580,9 @@ public void afterTransactionCompletion(boolean successful, boolean delayed) { getEventListenerManager().transactionCompletion( successful ); - if ( getFactory().getStatistics().isStatisticsEnabled() ) { - getFactory().getStatistics().endTransaction( successful ); + final StatisticsImplementor statistics = getFactory().getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.endTransaction( successful ); } try { 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 91d88564cf..737803dee4 100755 --- a/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java @@ -312,13 +312,14 @@ public Object internalLoad( // we could not use bytecode proxy, check to see if we can use HibernateProxy if ( persister.hasProxy() ) { - final Object existingProxy = getPersistenceContext().getProxy( entityKey ); + final PersistenceContext persistenceContext = getPersistenceContext(); + final Object existingProxy = persistenceContext.getProxy( entityKey ); if ( existingProxy != null ) { - return getPersistenceContext().narrowProxy( existingProxy, persister, entityKey, null ); + return persistenceContext.narrowProxy( existingProxy, persister, entityKey, null ); } else { final Object proxy = persister.createProxy( id, this ); - getPersistenceContext().addProxy( entityKey, proxy ); + persistenceContext.addProxy( entityKey, proxy ); return proxy; } } diff --git a/hibernate-core/src/main/java/org/hibernate/internal/util/xml/XmlDocumentImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/util/xml/XmlDocumentImpl.java deleted file mode 100644 index b2f59ef2f3..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/internal/util/xml/XmlDocumentImpl.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * License: GNU Lesser General Public License (LGPL), version 2.1 or later. - * See the lgpl.txt file in the root directory or . - */ -package org.hibernate.internal.util.xml; - -import java.io.Serializable; - -import org.dom4j.Document; - -/** - * Basic implemementation of {@link XmlDocument} - * - * @author Steve Ebersole - */ -public class XmlDocumentImpl implements XmlDocument, Serializable { - private final Document documentTree; - private final Origin origin; - - public XmlDocumentImpl(Document documentTree, String originType, String originName) { - this( documentTree, new OriginImpl( originType, originName ) ); - } - - public XmlDocumentImpl(Document documentTree, Origin origin) { - this.documentTree = documentTree; - this.origin = origin; - } - - @Override - public Document getDocumentTree() { - return documentTree; - } - - @Override - public Origin getOrigin() { - return origin; - } -} diff --git a/hibernate-core/src/main/java/org/hibernate/loader/Loader.java b/hibernate-core/src/main/java/org/hibernate/loader/Loader.java index 5d8ecd2b02..6ce601278a 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/Loader.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/Loader.java @@ -46,6 +46,7 @@ import org.hibernate.engine.internal.CacheHelper; import org.hibernate.engine.internal.TwoPhaseLoad; import org.hibernate.engine.jdbc.ColumnNameCache; +import org.hibernate.engine.jdbc.spi.JdbcCoordinator; import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.spi.EntityEntry; import org.hibernate.engine.spi.EntityKey; @@ -83,6 +84,7 @@ import org.hibernate.pretty.MessageHelper; import org.hibernate.proxy.HibernateProxy; import org.hibernate.query.spi.ScrollableResultsImplementor; +import org.hibernate.stat.spi.StatisticsImplementor; import org.hibernate.transform.CacheableResultTransformer; import org.hibernate.transform.ResultTransformer; import org.hibernate.type.AssociationType; @@ -968,8 +970,9 @@ private List doQuery( ); } finally { - session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( st ); - session.getJdbcCoordinator().afterStatementExecution(); + final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator(); + jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( st ); + jdbcCoordinator.afterStatementExecution(); } } @@ -1545,8 +1548,9 @@ private void checkVersion( null ); if ( !versionType.isEqual( version, currentVersion ) ) { - if ( session.getFactory().getStatistics().isStatisticsEnabled() ) { - session.getFactory().getStatistics().optimisticFailure( persister.getEntityName() ); + final StatisticsImplementor statistics = session.getFactory().getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.optimisticFailure( persister.getEntityName() ); } throw new StaleObjectStateException( persister.getEntityName(), id ); } @@ -2730,12 +2734,13 @@ private List getResultFromQueryCache( persistenceContext.setDefaultReadOnly( defaultReadOnlyOrig ); } - if ( factory.getStatistics().isStatisticsEnabled() ) { + final StatisticsImplementor statistics = factory.getStatistics(); + if ( statistics.isStatisticsEnabled() ) { if ( result == null ) { - factory.getStatistics().queryCacheMiss( getQueryIdentifier(), queryCache.getRegion().getName() ); + statistics.queryCacheMiss( getQueryIdentifier(), queryCache.getRegion().getName() ); } else { - factory.getStatistics().queryCacheHit( getQueryIdentifier(), queryCache.getRegion().getName() ); + statistics.queryCacheHit( getQueryIdentifier(), queryCache.getRegion().getName() ); } } } @@ -2761,8 +2766,9 @@ protected void putResultInQueryCache( key.getResultTransformer().getCachedResultTypes( resultTypes ), session ); - if ( put && factory.getStatistics().isStatisticsEnabled() ) { - factory.getStatistics().queryCachePut( getQueryIdentifier(), queryCache.getRegion().getName() ); + final StatisticsImplementor statistics = factory.getStatistics(); + if ( put && statistics.isStatisticsEnabled() ) { + statistics.queryCachePut( getQueryIdentifier(), queryCache.getRegion().getName() ); } } } @@ -2782,7 +2788,8 @@ private List doList( final ResultTransformer forcedResultTransformer) throws HibernateException { - final boolean stats = getFactory().getStatistics().isStatisticsEnabled(); + final StatisticsImplementor statistics = getFactory().getStatistics(); + final boolean stats = statistics.isStatisticsEnabled(); long startTime = 0; if ( stats ) { startTime = System.nanoTime(); @@ -2803,7 +2810,7 @@ private List doList( if ( stats ) { final long endTime = System.nanoTime(); final long milliseconds = TimeUnit.MILLISECONDS.convert( endTime - startTime, TimeUnit.NANOSECONDS ); - getFactory().getStatistics().queryExecuted( + statistics.queryExecuted( getQueryIdentifier(), result.size(), milliseconds @@ -2856,8 +2863,9 @@ protected ScrollableResultsImplementor scroll( final SharedSessionContractImplementor session) throws HibernateException { checkScrollability(); + final StatisticsImplementor statistics = getFactory().getStatistics(); final boolean stats = getQueryIdentifier() != null && - getFactory().getStatistics().isStatisticsEnabled(); + statistics.isStatisticsEnabled(); long startTime = 0; if ( stats ) { startTime = System.nanoTime(); @@ -2878,7 +2886,7 @@ protected ScrollableResultsImplementor scroll( if ( stats ) { final long endTime = System.nanoTime(); final long milliseconds = TimeUnit.MILLISECONDS.convert( endTime - startTime, TimeUnit.NANOSECONDS ); - getFactory().getStatistics().queryExecuted( + statistics.queryExecuted( getQueryIdentifier(), 0, milliseconds diff --git a/hibernate-core/src/main/java/org/hibernate/loader/entity/CacheEntityLoaderHelper.java b/hibernate-core/src/main/java/org/hibernate/loader/entity/CacheEntityLoaderHelper.java index 7aca306514..a8b32ffd13 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/entity/CacheEntityLoaderHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/entity/CacheEntityLoaderHelper.java @@ -40,6 +40,7 @@ import org.hibernate.pretty.MessageHelper; import org.hibernate.proxy.HibernateProxy; import org.hibernate.stat.internal.StatsHelper; +import org.hibernate.stat.spi.StatisticsImplementor; import org.hibernate.type.Type; import org.hibernate.type.TypeHelper; @@ -192,23 +193,25 @@ private Object getFromSharedCache( final EntityPersister persister, SessionImplementor source) { final EntityDataAccess cache = persister.getCacheAccessStrategy(); + final SessionFactoryImplementor factory = source.getFactory(); final Object ck = cache.generateCacheKey( event.getEntityId(), persister, - source.getFactory(), + factory, source.getTenantIdentifier() ); final Object ce = CacheHelper.fromSharedCache( source, ck, persister.getCacheAccessStrategy() ); - if ( source.getFactory().getStatistics().isStatisticsEnabled() ) { + final StatisticsImplementor statistics = factory.getStatistics(); + if ( statistics.isStatisticsEnabled() ) { if ( ce == null ) { - source.getFactory().getStatistics().entityCacheMiss( + statistics.entityCacheMiss( StatsHelper.INSTANCE.getRootEntityRole( persister ), cache.getRegion().getName() ); } else { - source.getFactory().getStatistics().entityCacheHit( + statistics.entityCacheHit( StatsHelper.INSTANCE.getRootEntityRole( persister ), cache.getRegion().getName() ); diff --git a/hibernate-core/src/main/java/org/hibernate/loader/hql/QueryLoader.java b/hibernate-core/src/main/java/org/hibernate/loader/hql/QueryLoader.java index 8c843e4239..efd17211a3 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/hql/QueryLoader.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/hql/QueryLoader.java @@ -45,6 +45,7 @@ import org.hibernate.persister.entity.Lockable; import org.hibernate.persister.entity.Queryable; import org.hibernate.query.spi.ScrollableResultsImplementor; +import org.hibernate.stat.spi.StatisticsImplementor; import org.hibernate.transform.ResultTransformer; import org.hibernate.type.EntityType; import org.hibernate.type.Type; @@ -514,7 +515,8 @@ public Iterator iterate( QueryParameters queryParameters, EventSource session) throws HibernateException { checkQuery( queryParameters ); - final boolean stats = session.getFactory().getStatistics().isStatisticsEnabled(); + final StatisticsImplementor statistics = session.getFactory().getStatistics(); + final boolean stats = statistics.isStatisticsEnabled(); long startTime = 0; if ( stats ) { startTime = System.nanoTime(); @@ -545,7 +547,7 @@ public Iterator iterate( if ( stats ) { final long endTime = System.nanoTime(); final long milliseconds = TimeUnit.MILLISECONDS.convert( endTime - startTime, TimeUnit.NANOSECONDS ); - session.getFactory().getStatistics().queryExecuted( + statistics.queryExecuted( // "HQL: " + queryTranslator.getQueryString(), getQueryIdentifier(), 0, diff --git a/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java index b88e21cefa..c7428908bd 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java @@ -33,6 +33,7 @@ import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.batch.internal.BasicBatchKey; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; +import org.hibernate.engine.jdbc.spi.JdbcCoordinator; import org.hibernate.engine.jdbc.spi.SqlExceptionHelper; import org.hibernate.engine.spi.EntityKey; import org.hibernate.engine.spi.ExecuteUpdateResultCheckStyle; @@ -1301,6 +1302,7 @@ public void recreate(PersistentCollection collection, Serializable id, SharedSes try { // create all the new entries Iterator entries = collection.entries( this ); + final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator(); if ( entries.hasNext() ) { Expectation expectation = Expectations.appropriateExpectation( getInsertCheckStyle() ); collection.preInsert( this ); @@ -1323,14 +1325,12 @@ public void recreate(PersistentCollection collection, Serializable id, SharedSes expectation ); } - st = session - .getJdbcCoordinator() + st = jdbcCoordinator .getBatch( recreateBatchKey ) .getBatchStatement( sql, callable ); } else { - st = session - .getJdbcCoordinator() + st = jdbcCoordinator .getStatementPreparer() .prepareStatement( sql, callable ); } @@ -1349,13 +1349,13 @@ public void recreate(PersistentCollection collection, Serializable id, SharedSes loc = writeElement( st, collection.getElement( entry ), loc, session ); if ( useBatch ) { - session - .getJdbcCoordinator() + jdbcCoordinator .getBatch( recreateBatchKey ) .addToBatch(); } else { - expectation.verifyOutcome( session.getJdbcCoordinator().getResultSetReturn().executeUpdate( st ), st, -1 ); + expectation.verifyOutcome( jdbcCoordinator + .getResultSetReturn().executeUpdate( st ), st, -1 ); } collection.afterRowInsert( this, entry, i ); @@ -1363,14 +1363,14 @@ public void recreate(PersistentCollection collection, Serializable id, SharedSes } catch ( SQLException sqle ) { if ( useBatch ) { - session.getJdbcCoordinator().abortBatch(); + jdbcCoordinator.abortBatch(); } throw sqle; } finally { if ( !useBatch ) { - session.getJdbcCoordinator().getResourceRegistry().release( st ); - session.getJdbcCoordinator().afterStatementExecution(); + jdbcCoordinator.getResourceRegistry().release( st ); + jdbcCoordinator.afterStatementExecution(); } } @@ -1957,23 +1957,23 @@ private void initCollectionPropertyMap(String aliasName, Type type, String[] col @Override public int getSize(Serializable key, SharedSessionContractImplementor session) { try { - PreparedStatement st = session - .getJdbcCoordinator() + final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator(); + PreparedStatement st = jdbcCoordinator .getStatementPreparer() .prepareStatement( sqlSelectSizeString ); try { getKeyType().nullSafeSet( st, key, 1, session ); - ResultSet rs = session.getJdbcCoordinator().getResultSetReturn().extract( st ); + ResultSet rs = jdbcCoordinator.getResultSetReturn().extract( st ); try { return rs.next() ? rs.getInt( 1 ) - baseIndex : 0; } finally { - session.getJdbcCoordinator().getResourceRegistry().release( rs, st ); + jdbcCoordinator.getResourceRegistry().release( rs, st ); } } finally { - session.getJdbcCoordinator().getResourceRegistry().release( st ); - session.getJdbcCoordinator().afterStatementExecution(); + jdbcCoordinator.getResourceRegistry().release( st ); + jdbcCoordinator.afterStatementExecution(); } } catch ( SQLException sqle ) { @@ -1998,27 +1998,27 @@ public boolean elementExists(Serializable key, Object element, SharedSessionCont private boolean exists(Serializable key, Object indexOrElement, Type indexOrElementType, String sql, SharedSessionContractImplementor session) { try { - PreparedStatement st = session - .getJdbcCoordinator() + final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator(); + PreparedStatement st = jdbcCoordinator .getStatementPreparer() .prepareStatement( sql ); try { getKeyType().nullSafeSet( st, key, 1, session ); indexOrElementType.nullSafeSet( st, indexOrElement, keyColumnNames.length + 1, session ); - ResultSet rs = session.getJdbcCoordinator().getResultSetReturn().extract( st ); + ResultSet rs = jdbcCoordinator.getResultSetReturn().extract( st ); try { return rs.next(); } finally { - session.getJdbcCoordinator().getResourceRegistry().release( rs, st ); + jdbcCoordinator.getResourceRegistry().release( rs, st ); } } catch ( TransientObjectException e ) { return false; } finally { - session.getJdbcCoordinator().getResourceRegistry().release( st ); - session.getJdbcCoordinator().afterStatementExecution(); + jdbcCoordinator.getResourceRegistry().release( st ); + jdbcCoordinator.afterStatementExecution(); } } catch ( SQLException sqle ) { @@ -2034,14 +2034,14 @@ private boolean exists(Serializable key, Object indexOrElement, Type indexOrElem @Override public Object getElementByIndex(Serializable key, Object index, SharedSessionContractImplementor session, Object owner) { try { - PreparedStatement st = session - .getJdbcCoordinator() + final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator(); + PreparedStatement st = jdbcCoordinator .getStatementPreparer() .prepareStatement( sqlSelectRowByIndexString ); try { getKeyType().nullSafeSet( st, key, 1, session ); getIndexType().nullSafeSet( st, incrementIndexByBase( index ), keyColumnNames.length + 1, session ); - ResultSet rs = session.getJdbcCoordinator().getResultSetReturn().extract( st ); + ResultSet rs = jdbcCoordinator.getResultSetReturn().extract( st ); try { if ( rs.next() ) { return getElementType().nullSafeGet( rs, elementColumnAliases, session, owner ); @@ -2051,12 +2051,12 @@ public Object getElementByIndex(Serializable key, Object index, SharedSessionCon } } finally { - session.getJdbcCoordinator().getResourceRegistry().release( rs, st ); + jdbcCoordinator.getResourceRegistry().release( rs, st ); } } finally { - session.getJdbcCoordinator().getResourceRegistry().release( st ); - session.getJdbcCoordinator().afterStatementExecution(); + jdbcCoordinator.getResourceRegistry().release( st ); + jdbcCoordinator.afterStatementExecution(); } } catch ( SQLException sqle ) { diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java index acf16a2035..787e45e8ff 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java @@ -129,6 +129,7 @@ import org.hibernate.sql.SimpleSelect; import org.hibernate.sql.Template; import org.hibernate.sql.Update; +import org.hibernate.stat.spi.StatisticsImplementor; import org.hibernate.tuple.GenerationTiming; import org.hibernate.tuple.InDatabaseValueGenerationStrategy; import org.hibernate.tuple.InMemoryValueGenerationStrategy; @@ -2554,8 +2555,9 @@ protected boolean check( } catch (StaleStateException e) { if ( !isNullableTable( tableNumber ) ) { - if ( getFactory().getStatistics().isStatisticsEnabled() ) { - getFactory().getStatistics().optimisticFailure( getEntityName() ); + final StatisticsImplementor statistics = getFactory().getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.optimisticFailure( getEntityName() ); } throw new StaleObjectStateException( getEntityName(), id ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/AbstractProducedQuery.java b/hibernate-core/src/main/java/org/hibernate/query/internal/AbstractProducedQuery.java index 5bd6cd875e..063094bf92 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/AbstractProducedQuery.java +++ b/hibernate-core/src/main/java/org/hibernate/query/internal/AbstractProducedQuery.java @@ -946,21 +946,25 @@ protected void collectBaselineHints(Map hints) { } protected void collectHints(Map hints) { - if ( getQueryOptions().getTimeout() != null ) { - hints.put( HINT_TIMEOUT, getQueryOptions().getTimeout() ); - hints.put( SPEC_HINT_TIMEOUT, getQueryOptions().getTimeout() * 1000 ); + final RowSelection queryOptions = getQueryOptions(); + final Integer queryTimeout = queryOptions.getTimeout(); + if ( queryTimeout != null ) { + hints.put( HINT_TIMEOUT, queryTimeout ); + hints.put( SPEC_HINT_TIMEOUT, queryTimeout * 1000 ); } - if ( getLockOptions().getTimeOut() != WAIT_FOREVER ) { - hints.put( JPA_LOCK_TIMEOUT, getLockOptions().getTimeOut() ); + final LockOptions lockOptions = getLockOptions(); + final int lockOptionsTimeOut = lockOptions.getTimeOut(); + if ( lockOptionsTimeOut != WAIT_FOREVER ) { + hints.put( JPA_LOCK_TIMEOUT, lockOptionsTimeOut ); } - if ( getLockOptions().getScope() ) { - hints.put( JPA_LOCK_SCOPE, getLockOptions().getScope() ); + if ( lockOptions.getScope() ) { + hints.put( JPA_LOCK_SCOPE, lockOptions.getScope() ); } - if ( getLockOptions().hasAliasSpecificLockModes() && canApplyAliasSpecificLockModeHints() ) { - for ( Map.Entry entry : getLockOptions().getAliasSpecificLocks() ) { + if ( lockOptions.hasAliasSpecificLockModes() && canApplyAliasSpecificLockModeHints() ) { + for ( Map.Entry entry : lockOptions.getAliasSpecificLocks() ) { hints.put( ALIAS_SPECIFIC_LOCK_MODE + '.' + entry.getKey(), entry.getValue().name() @@ -969,7 +973,7 @@ protected void collectHints(Map hints) { } putIfNotNull( hints, HINT_COMMENT, getComment() ); - putIfNotNull( hints, HINT_FETCH_SIZE, getQueryOptions().getFetchSize() ); + putIfNotNull( hints, HINT_FETCH_SIZE, queryOptions.getFetchSize() ); putIfNotNull( hints, HINT_FLUSH_MODE, getHibernateFlushMode() ); if ( cacheStoreMode != null || cacheRetrieveMode != null ) { diff --git a/hibernate-core/src/main/java/org/hibernate/service/internal/AbstractServiceRegistryImpl.java b/hibernate-core/src/main/java/org/hibernate/service/internal/AbstractServiceRegistryImpl.java index 22f2945c17..5599da1378 100644 --- a/hibernate-core/src/main/java/org/hibernate/service/internal/AbstractServiceRegistryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/service/internal/AbstractServiceRegistryImpl.java @@ -305,7 +305,8 @@ private void applyInjections(R service) { @SuppressWarnings({ "unchecked" }) private void processInjection(T service, Method injectionMethod, InjectService injectService) { - if ( injectionMethod.getParameterTypes() == null || injectionMethod.getParameterCount() != 1 ) { + final Class[] parameterTypes = injectionMethod.getParameterTypes(); + if ( parameterTypes == null || injectionMethod.getParameterCount() != 1 ) { throw new ServiceDependencyException( "Encountered @InjectService on method with unexpected number of parameters" ); @@ -313,7 +314,7 @@ private void processInjection(T service, Method injectionMet Class dependentServiceRole = injectService.serviceRole(); if ( dependentServiceRole == null || dependentServiceRole.equals( Void.class ) ) { - dependentServiceRole = injectionMethod.getParameterTypes()[0]; + dependentServiceRole = parameterTypes[0]; } // todo : because of the use of proxies, this is no longer returning null here...