Skip to content

Commit 4d27abb

Browse files
committed
HHH-19318 unbreak follow-on locking for StatelessSession
1 parent bdc1aa9 commit 4d27abb

File tree

5 files changed

+30
-13
lines changed

5 files changed

+30
-13
lines changed

hibernate-core/src/main/java/org/hibernate/engine/spi/SessionImplementor.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import jakarta.persistence.ConnectionConsumer;
88
import jakarta.persistence.ConnectionFunction;
99
import org.hibernate.HibernateException;
10-
import org.hibernate.LockOptions;
1110
import org.hibernate.Session;
1211
import org.hibernate.engine.jdbc.LobCreationContext;
1312
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
@@ -95,11 +94,6 @@ default SessionImplementor getSession() {
9594
*/
9695
void forceFlush(EntityKey e) throws HibernateException;
9796

98-
/**
99-
* Cascade the lock operation to the given child entity.
100-
*/
101-
void lock(String entityName, Object child, LockOptions lockOptions);
102-
10397
@Override
10498
default SessionImplementor asSessionImplementor() {
10599
return this;

hibernate-core/src/main/java/org/hibernate/engine/spi/SharedSessionContractImplementor.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.hibernate.Incubating;
1616
import org.hibernate.Interceptor;
1717
import org.hibernate.LockMode;
18+
import org.hibernate.LockOptions;
1819
import org.hibernate.StatelessSession;
1920
import org.hibernate.boot.spi.SessionFactoryOptions;
2021
import org.hibernate.dialect.Dialect;
@@ -586,6 +587,11 @@ default boolean isStatelessSession() {
586587
return false;
587588
}
588589

590+
/**
591+
* Cascade the lock operation to the given child entity.
592+
*/
593+
void lock(String entityName, Object child, LockOptions lockOptions);
594+
589595
/**
590596
* Attempts to load the entity from the second-level cache.
591597
*

hibernate-core/src/main/java/org/hibernate/engine/spi/SharedSessionDelegatorBaseImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.hibernate.HibernateException;
1919
import org.hibernate.Interceptor;
2020
import org.hibernate.LockMode;
21+
import org.hibernate.LockOptions;
2122
import org.hibernate.SharedSessionContract;
2223
import org.hibernate.Transaction;
2324
import org.hibernate.cache.spi.CacheTransactionSynchronization;
@@ -693,6 +694,11 @@ public FormatMapper getXmlFormatMapper() {
693694
return delegate.getXmlFormatMapper();
694695
}
695696

697+
@Override
698+
public void lock(String entityName, Object child, LockOptions lockOptions) {
699+
delegate.lock( entityName, child, lockOptions );
700+
}
701+
696702
@Override
697703
public Object loadFromSecondLevelCache(EntityPersister persister, EntityKey entityKey, Object instanceToLoad, LockMode lockMode) {
698704
return delegate.loadFromSecondLevelCache( persister, entityKey, instanceToLoad, lockMode );

hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
import java.util.Set;
1010
import java.util.function.BiConsumer;
1111

12+
import org.hibernate.AssertionFailure;
1213
import org.hibernate.FlushMode;
1314
import org.hibernate.HibernateException;
1415
import org.hibernate.LockMode;
16+
import org.hibernate.LockOptions;
1517
import org.hibernate.SessionException;
1618
import org.hibernate.StatelessSession;
1719
import org.hibernate.TransientObjectException;
@@ -26,6 +28,7 @@
2628
import org.hibernate.collection.spi.PersistentCollection;
2729
import org.hibernate.engine.spi.CollectionEntry;
2830
import org.hibernate.engine.spi.EffectiveEntityGraph;
31+
import org.hibernate.engine.spi.EntityEntry;
2932
import org.hibernate.engine.spi.EntityHolder;
3033
import org.hibernate.engine.spi.EntityKey;
3134
import org.hibernate.engine.spi.LoadQueryInfluencers;
@@ -70,6 +73,7 @@
7073
import org.hibernate.graph.GraphSemantic;
7174
import org.hibernate.graph.spi.RootGraphImplementor;
7275
import org.hibernate.id.IdentifierGenerationException;
76+
import org.hibernate.loader.ast.internal.LoaderHelper;
7377
import org.hibernate.loader.ast.spi.CascadingFetchProfile;
7478
import org.hibernate.loader.internal.CacheLoadHelper;
7579
import org.hibernate.persister.collection.CollectionPersister;
@@ -1347,6 +1351,17 @@ protected void removeCacheItem(Object ck, CollectionPersister persister) {
13471351
}
13481352
}
13491353

1354+
@Override
1355+
public void lock(String entityName, Object child, LockOptions lockOptions) {
1356+
final EntityPersister persister = getEntityPersister( entityName, child );
1357+
persister.lock( persister.getIdentifier( child ), persister.getVersion( child ), child, lockOptions, this );
1358+
final EntityEntry entry = getPersistenceContextInternal().getEntry( child );
1359+
if ( entry == null ) {
1360+
throw new AssertionFailure( "no entry in temporary persistence context" );
1361+
}
1362+
LoaderHelper.upgradeLock( child, entry, lockOptions, this );
1363+
}
1364+
13501365
@Override
13511366
public Object loadFromSecondLevelCache(EntityPersister persister, EntityKey entityKey, Object instanceToLoad, LockMode lockMode) {
13521367
return CacheLoadHelper.loadFromSecondLevelCache( this, instanceToLoad, lockMode, persister, entityKey );

hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/DeferredResultSetAccess.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -134,13 +134,9 @@ public DeferredResultSetAccess(
134134
* For Hibernate Reactive
135135
*/
136136
protected void registerAfterLoadAction(ExecutionContext executionContext, LockOptions lockOptionsToUse) {
137-
executionContext.getCallback().registerAfterLoadAction( (entity, persister, session) ->
138-
session.asSessionImplementor().lock(
139-
persister.getEntityName(),
140-
entity,
141-
lockOptionsToUse
142-
)
143-
);
137+
executionContext.getCallback()
138+
.registerAfterLoadAction( (entity, persister, session) ->
139+
session.lock( persister.getEntityName(), entity, lockOptionsToUse ) );
144140
}
145141

146142
private static boolean useFollowOnLocking(

0 commit comments

Comments
 (0)