Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
import org.hibernate.engine.jdbc.env.spi.IdentifierHelperBuilder;
import org.hibernate.engine.jdbc.env.spi.NameQualifierSupport;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.event.spi.EventSource;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.exception.ConstraintViolationException;
import org.hibernate.exception.spi.SQLExceptionConversionDelegate;
import org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor;
Expand Down Expand Up @@ -797,7 +797,7 @@ private ReadUncommittedLockingStrategy(EntityPersister lockable, LockMode lockMo
}

@Override
public void lock(Object id, Object version, Object object, int timeout, EventSource session)
public void lock(Object id, Object version, Object object, int timeout, SharedSessionContractImplementor session)
throws StaleObjectStateException, JDBCException {
if ( getLockMode().greaterThan( LockMode.READ ) ) {
LOG.hsqldbSupportsOnlyReadCommittedIsolation();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
import org.hibernate.engine.jdbc.env.spi.SchemaNameResolver;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.event.spi.EventSource;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.internal.util.collections.ArrayHelper;
import org.hibernate.mapping.Column;
import org.hibernate.mapping.ForeignKey;
Expand Down Expand Up @@ -891,7 +891,7 @@ static class DoNothingLockingStrategy implements LockingStrategy {

@Override
public void lock(
Object id, Object version, Object object, int timeout, EventSource session)
Object id, Object version, Object object, int timeout, SharedSessionContractImplementor session)
throws StaleObjectStateException, LockingStrategyException {
// Do nothing. Cloud Spanner doesn't have have locking strategies.
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import org.hibernate.StaleObjectStateException;
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.event.spi.EventSource;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.sql.SimpleSelect;
import org.hibernate.stat.spi.StatisticsImplementor;
Expand Down Expand Up @@ -69,7 +69,7 @@ protected String generateLockString(int lockTimeout) {
}

@Override
public void lock(Object id, Object version, Object object, int timeout, EventSource session)
public void lock(Object id, Object version, Object object, int timeout, SharedSessionContractImplementor session)
throws StaleObjectStateException, JDBCException {
final String sql = determineSql( timeout );
final SessionFactoryImplementor factory = session.getFactory();
Expand Down Expand Up @@ -112,7 +112,7 @@ public void lock(Object id, Object version, Object object, int timeout, EventSou
}
}

private JDBCException jdbcException(Object id, EventSource session, SQLException sqle, String sql) {
private JDBCException jdbcException(Object id, SharedSessionContractImplementor session, SQLException sqle, String sql) {
return session.getJdbcServices().getSqlExceptionHelper()
.convert( sqle, "could not lock: " + infoString( lockable, id, session.getFactory() ), sql );
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package org.hibernate.dialect.lock;

import org.hibernate.StaleObjectStateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.event.spi.EventSource;

/**
Expand All @@ -22,6 +23,28 @@
* @author Steve Ebersole
*/
public interface LockingStrategy {
/**
* Acquire an appropriate type of lock on the underlying data that will
* endure until the end of the current transaction.
*
* @param id The id of the row to be locked
* @param version The current version (or null if not versioned)
* @param object The object logically being locked (currently not used)
* @param timeout timeout in milliseconds, 0 = no wait, -1 = wait indefinitely
* @param session The session from which the lock request originated
*
* @throws StaleObjectStateException Indicates an inability to locate the database row as part of acquiring
* the requested lock.
* @throws LockingStrategyException Indicates a failure in the lock attempt
*
* @deprecated Use {@link #lock(Object, Object, Object, int, SharedSessionContractImplementor)}
*/
@Deprecated(since = "7")
default void lock(Object id, Object version, Object object, int timeout, EventSource session)
throws StaleObjectStateException, LockingStrategyException {
lock( id, version, object, timeout, (SharedSessionContractImplementor) session );
}

/**
* Acquire an appropriate type of lock on the underlying data that will
* endure until the end of the current transaction.
Expand All @@ -36,6 +59,13 @@
* the requested lock.
* @throws LockingStrategyException Indicates a failure in the lock attempt
*/
void lock(Object id, Object version, Object object, int timeout, EventSource session)
throws StaleObjectStateException, LockingStrategyException;
default void lock(Object id, Object version, Object object, int timeout, SharedSessionContractImplementor session)

Check notice

Code scanning / CodeQL

Confusing overloading of methods Note

Method LockingStrategy.lock(..) could be confused with overloaded method
OptimisticForceIncrementLockingStrategy.lock
, since dispatch depends on static types.
Method LockingStrategy.lock(..) could be confused with overloaded method
OptimisticLockingStrategy.lock
, since dispatch depends on static types.
throws StaleObjectStateException, LockingStrategyException {
if ( session instanceof EventSource eventSource ) {
lock( id, version, object, timeout, eventSource );
}
else {
throw new UnsupportedOperationException( "Optimistic locking strategies not supported in stateless session" );
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import org.hibernate.HibernateException;
import org.hibernate.LockMode;
import org.hibernate.engine.spi.EntityEntry;
import org.hibernate.event.spi.EventSource;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.persister.entity.EntityPersister;

/**
Expand Down Expand Up @@ -39,7 +39,7 @@ public PessimisticForceIncrementLockingStrategy(EntityPersister lockable, LockMo
}

@Override
public void lock(Object id, Object version, Object object, int timeout, EventSource session) {
public void lock(Object id, Object version, Object object, int timeout, SharedSessionContractImplementor session) {
if ( !lockable.isVersioned() ) {
throw new HibernateException( "[" + lockMode + "] not supported for non-versioned entities [" + lockable.getEntityName() + "]" );
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import org.hibernate.StaleObjectStateException;
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.event.spi.EventSource;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.pretty.MessageHelper;
Expand Down Expand Up @@ -69,7 +69,7 @@ public PessimisticReadUpdateLockingStrategy(EntityPersister lockable, LockMode l
}

@Override
public void lock(Object id, Object version, Object object, int timeout, EventSource session) {
public void lock(Object id, Object version, Object object, int timeout, SharedSessionContractImplementor session) {
if ( !lockable.isVersioned() ) {
throw new HibernateException( "write locks via update not supported for non-versioned entities [" + lockable.getEntityName() + "]" );
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import org.hibernate.StaleObjectStateException;
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.event.spi.EventSource;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.pretty.MessageHelper;
Expand Down Expand Up @@ -68,7 +68,7 @@ public PessimisticWriteUpdateLockingStrategy(EntityPersister lockable, LockMode
}

@Override
public void lock(Object id, Object version, Object object, int timeout, EventSource session) {
public void lock(Object id, Object version, Object object, int timeout, SharedSessionContractImplementor session) {
if ( !lockable.isVersioned() ) {
throw new HibernateException( "write locks via update not supported for non-versioned entities [" + lockable.getEntityName() + "]" );
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import org.hibernate.StaleObjectStateException;
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.event.spi.EventSource;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.pretty.MessageHelper;
Expand Down Expand Up @@ -72,7 +72,7 @@ public void lock(
Object version,
Object object,
int timeout,
EventSource session) throws StaleObjectStateException, JDBCException {
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 [" + lockableEntityName + "]" );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1236,4 +1236,9 @@ public FormatMapper getJsonFormatMapper() {
public FormatMapper getXmlFormatMapper() {
return delegate.getXmlFormatMapper();
}

@Override
public Object loadFromSecondLevelCache(EntityPersister persister, EntityKey entityKey, Object instanceToLoad, LockMode lockMode) {
return delegate.loadFromSecondLevelCache( persister, entityKey, instanceToLoad, lockMode );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@

import org.hibernate.FlushMode;
import org.hibernate.HibernateException;
import org.hibernate.Incubating;
import org.hibernate.Interceptor;
import org.hibernate.LockMode;
import org.hibernate.StatelessSession;
import org.hibernate.boot.spi.SessionFactoryOptions;
import org.hibernate.dialect.Dialect;
Expand Down Expand Up @@ -584,4 +586,18 @@ default boolean isStatelessSession() {
return false;
}

/**
* Attempts to load the entity from the second-level cache.
*
* @param persister The persister for the entity being requested for load
* @param entityKey The entity key
* @param instanceToLoad The instance that is being initialized, or null
* @param lockMode The lock mode
*
* @return The entity from the second-level cache, or null.
*
* @since 7.0
*/
@Incubating
Object loadFromSecondLevelCache(EntityPersister persister, EntityKey entityKey, Object instanceToLoad, LockMode lockMode);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.hibernate.FlushMode;
import org.hibernate.HibernateException;
import org.hibernate.Interceptor;
import org.hibernate.LockMode;
import org.hibernate.SharedSessionContract;
import org.hibernate.Transaction;
import org.hibernate.cache.spi.CacheTransactionSynchronization;
Expand Down Expand Up @@ -691,4 +692,9 @@ public FormatMapper getJsonFormatMapper() {
public FormatMapper getXmlFormatMapper() {
return delegate.getXmlFormatMapper();
}

@Override
public Object loadFromSecondLevelCache(EntityPersister persister, EntityKey entityKey, Object instanceToLoad, LockMode lockMode) {
return delegate.loadFromSecondLevelCache( persister, entityKey, instanceToLoad, lockMode );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
package org.hibernate.event.spi;

import org.hibernate.HibernateException;
import org.hibernate.Incubating;
import org.hibernate.LockMode;
import org.hibernate.engine.spi.ActionQueue;
import org.hibernate.engine.spi.EntityEntry;
import org.hibernate.engine.spi.EntityKey;
Expand Down Expand Up @@ -70,18 +68,4 @@ public interface EventSource extends SessionImplementor {
// This should be removed once action/task ordering is improved.
void removeOrphanBeforeUpdates(String entityName, Object child);

/**
* Attempts to load the entity from the second-level cache.
*
* @param persister The persister for the entity being requested for load
* @param entityKey The entity key
* @param instanceToLoad The instance that is being initialized, or null
* @param lockMode The lock mode
*
* @return The entity from the second-level cache, or null.
*
* @since 7.0
*/
@Incubating
Object loadFromSecondLevelCache(EntityPersister persister, EntityKey entityKey, Object instanceToLoad, LockMode lockMode);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.hibernate.engine.spi.EffectiveEntityGraph;
import org.hibernate.engine.spi.LoadQueryInfluencers;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.graph.GraphSemantic;
import org.hibernate.graph.RootGraph;
import org.hibernate.graph.spi.RootGraphImplementor;
Expand All @@ -28,7 +29,7 @@
* @author Steve Ebersole
*/
class MultiIdentifierLoadAccessImpl<T> implements MultiIdentifierLoadAccess<T>, MultiIdLoadOptions {
private final SessionImpl session;
private final SharedSessionContractImplementor session;
private final EntityPersister entityPersister;

private LockOptions lockOptions;
Expand All @@ -46,7 +47,7 @@ class MultiIdentifierLoadAccessImpl<T> implements MultiIdentifierLoadAccess<T>,
private Set<String> enabledFetchProfiles;
private Set<String> disabledFetchProfiles;

public MultiIdentifierLoadAccessImpl(SessionImpl session, EntityPersister entityPersister) {
public MultiIdentifierLoadAccessImpl(SharedSessionContractImplementor session, EntityPersister entityPersister) {
this.session = session;
this.entityPersister = entityPersister;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import org.hibernate.NaturalIdMultiLoadAccess;
import org.hibernate.engine.spi.EffectiveEntityGraph;
import org.hibernate.engine.spi.LoadQueryInfluencers;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.graph.GraphSemantic;
import org.hibernate.graph.RootGraph;
import org.hibernate.graph.spi.RootGraphImplementor;
Expand All @@ -24,7 +25,7 @@
*/
public class NaturalIdMultiLoadAccessStandard<T> implements NaturalIdMultiLoadAccess<T>, MultiNaturalIdLoadOptions {
private final EntityPersister entityDescriptor;
private final SessionImpl session;
private final SharedSessionContractImplementor session;

private LockOptions lockOptions;
private CacheMode cacheMode;
Expand All @@ -36,7 +37,7 @@ public class NaturalIdMultiLoadAccessStandard<T> implements NaturalIdMultiLoadAc
private boolean returnOfDeletedEntitiesEnabled;
private boolean orderedReturnEnabled = true;

public NaturalIdMultiLoadAccessStandard(EntityPersister entityDescriptor, SessionImpl session) {
public NaturalIdMultiLoadAccessStandard(EntityPersister entityDescriptor, SharedSessionContractImplementor session) {
this.entityDescriptor = entityDescriptor;
this.session = session;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
import org.hibernate.graph.spi.RootGraphImplementor;
import org.hibernate.id.IdentifierGenerationException;
import org.hibernate.loader.ast.spi.CascadingFetchProfile;
import org.hibernate.loader.internal.CacheLoadHelper;
import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.proxy.LazyInitializer;
Expand All @@ -93,7 +94,6 @@
import static org.hibernate.generator.EventType.INSERT;
import static org.hibernate.internal.util.NullnessUtil.castNonNull;
import static org.hibernate.loader.internal.CacheLoadHelper.initializeCollectionFromCache;
import static org.hibernate.loader.internal.CacheLoadHelper.loadFromSecondLevelCache;
import static org.hibernate.pretty.MessageHelper.collectionInfoString;
import static org.hibernate.pretty.MessageHelper.infoString;
import static org.hibernate.proxy.HibernateProxy.extractLazyInitializer;
Expand Down Expand Up @@ -715,8 +715,7 @@ public Object get(String entityName, Object id, LockMode lockMode) {
final EntityPersister persister = requireEntityPersister( entityName );
if ( persister.canReadFromCache() ) {
final Object cachedEntity =
loadFromSecondLevelCache( this, null, lockMode, persister,
generateEntityKey( id, persister ) );
loadFromSecondLevelCache( persister, generateEntityKey( id, persister ), null, lockMode );
if ( cachedEntity != null ) {
temporaryPersistenceContext.clear();
return cachedEntity;
Expand Down Expand Up @@ -779,8 +778,7 @@ public <T> List<T> getMultiple(Class<T> entityClass, List<?> ids) {
uncachedIds = new ArrayList<>( ids.size() );
for (Object id : ids) {
final Object cachedEntity =
loadFromSecondLevelCache( this, null, LockMode.NONE, persister,
generateEntityKey( id, persister ) );
loadFromSecondLevelCache( persister, generateEntityKey( id, persister ), null, LockMode.NONE );
if ( cachedEntity == null ) {
uncachedIds.add( id );
list.add( null );
Expand Down Expand Up @@ -1348,4 +1346,10 @@ protected void removeCacheItem(Object ck, CollectionPersister persister) {
persister.getCacheAccessStrategy().remove( this, ck );
}
}

@Override
public Object loadFromSecondLevelCache(EntityPersister persister, EntityKey entityKey, Object instanceToLoad, LockMode lockMode) {
return CacheLoadHelper.loadFromSecondLevelCache( this, instanceToLoad, lockMode, persister, entityKey );
}

}
Loading