Skip to content

Commit d4b8c5b

Browse files
committed
EventSource - StatelessSession, callbacks and Envers
1 parent ecfa948 commit d4b8c5b

File tree

60 files changed

+870
-432
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+870
-432
lines changed

hibernate-core/src/main/java/org/hibernate/action/internal/EntityIncrementVersionProcess.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
package org.hibernate.action.internal;
66

77
import org.hibernate.action.spi.BeforeTransactionCompletionProcess;
8-
import org.hibernate.engine.spi.SessionImplementor;
8+
import org.hibernate.engine.spi.SharedSessionContractImplementor;
99
import org.hibernate.internal.OptimisticLockHelper;
1010

1111
/**
@@ -33,9 +33,9 @@ public EntityIncrementVersionProcess(Object object) {
3333
* @param session The session on which the transaction is preparing to complete.
3434
*/
3535
@Override
36-
public void doBeforeTransactionCompletion(SessionImplementor session) {
36+
public void doBeforeTransactionCompletion(SharedSessionContractImplementor session) {
3737
final var entry = session.getPersistenceContext().getEntry( object );
38-
// Don't increment version for an entity that is not in the PersistenceContext;
38+
// Don't increment the version for an entity that is not in the PersistenceContext;
3939
if ( entry != null ) {
4040
OptimisticLockHelper.forceVersionIncrement( object, entry, session.asEventSource() );
4141
}

hibernate-core/src/main/java/org/hibernate/action/internal/EntityVerifyVersionProcess.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import org.hibernate.action.spi.BeforeTransactionCompletionProcess;
88
import org.hibernate.dialect.lock.OptimisticEntityLockException;
9-
import org.hibernate.engine.spi.SessionImplementor;
9+
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1010
import org.hibernate.pretty.MessageHelper;
1111

1212
/**
@@ -29,9 +29,9 @@ public EntityVerifyVersionProcess(Object object) {
2929
}
3030

3131
@Override
32-
public void doBeforeTransactionCompletion(SessionImplementor session) {
32+
public void doBeforeTransactionCompletion(SharedSessionContractImplementor session) {
3333
final var entry = session.getPersistenceContext().getEntry( object );
34-
// Don't check version for an entity that is not in the PersistenceContext
34+
// Don't check the version for an entity that is not in the PersistenceContext
3535
if ( entry != null ) {
3636
final Object latestVersion = entry.getPersister().getCurrentVersion( entry.getId(), session );
3737
if ( !entry.getVersion().equals( latestVersion ) ) {

hibernate-core/src/main/java/org/hibernate/action/spi/AfterTransactionCompletionProcess.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,12 @@
44
*/
55
package org.hibernate.action.spi;
66

7-
import org.hibernate.engine.spi.SharedSessionContractImplementor;
7+
import org.hibernate.engine.spi.TransactionCompletionCallbacks;
88

99
/**
1010
* Contract representing some process that needs to occur during after transaction completion.
1111
*
1212
* @author Steve Ebersole
1313
*/
14-
public interface AfterTransactionCompletionProcess {
15-
/**
16-
* Perform whatever processing is encapsulated here after completion of the transaction.
17-
*
18-
* @param success Did the transaction complete successfully? True means it did.
19-
* @param session The session on which the transaction is completing.
20-
*/
21-
void doAfterTransactionCompletion(boolean success, SharedSessionContractImplementor session);
14+
public interface AfterTransactionCompletionProcess extends TransactionCompletionCallbacks.AfterCompletionCallback {
2215
}

hibernate-core/src/main/java/org/hibernate/action/spi/BeforeTransactionCompletionProcess.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,23 @@
55
package org.hibernate.action.spi;
66

77
import org.hibernate.engine.spi.SessionImplementor;
8+
import org.hibernate.engine.spi.SharedSessionContractImplementor;
9+
import org.hibernate.engine.spi.TransactionCompletionCallbacks;
810

911
/**
1012
* Contract representing some process that needs to occur during before transaction completion.
1113
*
1214
* @author Steve Ebersole
1315
*/
14-
public interface BeforeTransactionCompletionProcess {
16+
public interface BeforeTransactionCompletionProcess extends TransactionCompletionCallbacks.BeforeCompletionCallback {
1517
/**
1618
* Perform whatever processing is encapsulated here before completion of the transaction.
1719
*
1820
* @param session The session on which the transaction is preparing to complete.
21+
* @deprecated Use {@linkplain #doBeforeTransactionCompletion(SharedSessionContractImplementor)} instead.
1922
*/
20-
void doBeforeTransactionCompletion(SessionImplementor session);
23+
@Deprecated(since = "7.2", forRemoval = true)
24+
default void doBeforeTransactionCompletion(SessionImplementor session) {
25+
doBeforeTransactionCompletion( (SharedSessionContractImplementor) session );
26+
}
2127
}

hibernate-core/src/main/java/org/hibernate/cache/internal/CollectionCacheInvalidator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ private void evictCollection(
140140
final CollectionDataAccess cacheAccessStrategy = collectionPersister.getCacheAccessStrategy();
141141
final SoftLock softLock = cacheAccessStrategy.lockRegion();
142142
session.getActionQueue()
143-
.registerProcess( (success, s) -> cacheAccessStrategy.unlockRegion( softLock ) );
143+
.registerCallback( (success, s) -> cacheAccessStrategy.unlockRegion( softLock ) );
144144
}
145145
}
146146
}
@@ -198,7 +198,7 @@ private void evict(Object id, CollectionPersister collectionPersister, EventSour
198198
final CollectionEvictCacheAction evictCacheAction =
199199
new CollectionEvictCacheAction( collectionPersister, null, id, session );
200200
evictCacheAction.execute();
201-
session.getActionQueue().registerProcess( evictCacheAction.getAfterTransactionCompletionProcess() );
201+
session.getActionQueue().registerCallback( evictCacheAction.getAfterTransactionCompletionProcess() );
202202
}
203203

204204
//execute the same process as invalidation with collection operations

hibernate-core/src/main/java/org/hibernate/dialect/lock/OptimisticForceIncrementLockingStrategy.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public void lock(Object id, Object version, Object object, int timeout, EventSou
4545
}
4646
// final EntityEntry entry = session.getPersistenceContextInternal().getEntry( object );
4747
// Register the EntityIncrementVersionProcess action to run just prior to transaction commit.
48-
session.getActionQueue().registerProcess( new EntityIncrementVersionProcess( object ) );
48+
session.getActionQueue().registerCallback( new EntityIncrementVersionProcess( object ) );
4949
}
5050

5151
protected LockMode getLockMode() {

hibernate-core/src/main/java/org/hibernate/dialect/lock/OptimisticLockingStrategy.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public void lock(Object id, Object version, Object object, int timeout, EventSou
4343
throw new HibernateException( "[" + lockMode + "] not supported for non-versioned entities [" + lockable.getEntityName() + "]" );
4444
}
4545
// Register the EntityVerifyVersionProcess action to run just prior to transaction commit.
46-
session.getActionQueue().registerProcess( new EntityVerifyVersionProcess( object ) );
46+
session.getActionQueue().registerCallback( new EntityVerifyVersionProcess( object ) );
4747
}
4848

4949
protected LockMode getLockMode() {
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.engine.internal;
6+
7+
import org.checkerframework.checker.nullness.qual.NonNull;
8+
import org.checkerframework.checker.nullness.qual.Nullable;
9+
import org.hibernate.engine.spi.SharedSessionContractImplementor;
10+
import org.hibernate.engine.spi.TransactionCompletionCallbacks.CompletionCallback;
11+
12+
import java.util.concurrent.ConcurrentLinkedQueue;
13+
14+
/**
15+
* Collection of transaction completion {@linkplain CompletionCallback callbacks}.
16+
*
17+
* @author Steve Ebersole
18+
*/
19+
public abstract class AbstractTransactionCompletionProcessQueue<T extends CompletionCallback> {
20+
protected SharedSessionContractImplementor session;
21+
// Concurrency handling required when transaction completion process is dynamically registered
22+
// inside event listener (HHH-7478).
23+
protected ConcurrentLinkedQueue<@NonNull T> processes = new ConcurrentLinkedQueue<>();
24+
25+
protected AbstractTransactionCompletionProcessQueue(SharedSessionContractImplementor session) {
26+
this.session = session;
27+
}
28+
29+
public void register(@Nullable T process) {
30+
if ( process != null ) {
31+
processes.add( process );
32+
}
33+
}
34+
35+
public boolean hasActions() {
36+
return !processes.isEmpty();
37+
}
38+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.engine.internal;
6+
7+
import org.hibernate.HibernateException;
8+
import org.hibernate.cache.CacheException;
9+
import org.hibernate.engine.spi.SessionFactoryImplementor;
10+
import org.hibernate.engine.spi.SharedSessionContractImplementor;
11+
import org.hibernate.engine.spi.TransactionCompletionCallbacks.AfterCompletionCallback;
12+
import org.hibernate.internal.CoreLogging;
13+
import org.hibernate.internal.CoreMessageLogger;
14+
15+
import java.util.HashSet;
16+
import java.util.Set;
17+
18+
/**
19+
* Encapsulates behavior needed for after transaction processing
20+
*/
21+
public class AfterTransactionCompletionProcessQueue
22+
extends AbstractTransactionCompletionProcessQueue<AfterCompletionCallback> {
23+
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( AfterTransactionCompletionProcessQueue.class );
24+
25+
private final Set<String> querySpacesToInvalidate = new HashSet<>();
26+
27+
public AfterTransactionCompletionProcessQueue(SharedSessionContractImplementor session) {
28+
super( session );
29+
}
30+
31+
public void addSpaceToInvalidate(String space) {
32+
querySpacesToInvalidate.add( space );
33+
}
34+
35+
@Override
36+
public boolean hasActions() {
37+
return super.hasActions() || !querySpacesToInvalidate.isEmpty();
38+
}
39+
40+
public void afterTransactionCompletion(boolean success) {
41+
AfterCompletionCallback process;
42+
while ( (process = processes.poll()) != null ) {
43+
try {
44+
process.doAfterTransactionCompletion( success, session );
45+
}
46+
catch (CacheException ce) {
47+
LOG.unableToReleaseCacheLock( ce );
48+
// continue loop
49+
}
50+
catch (Exception e) {
51+
throw new HibernateException(
52+
"Unable to perform afterTransactionCompletion callback: " + e.getMessage(), e );
53+
}
54+
}
55+
56+
final SessionFactoryImplementor factory = session.getFactory();
57+
if ( factory.getSessionFactoryOptions().isQueryCacheEnabled() ) {
58+
factory.getCache().getTimestampsCache()
59+
.invalidate( querySpacesToInvalidate.toArray( new String[0] ), session );
60+
}
61+
querySpacesToInvalidate.clear();
62+
}
63+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.engine.internal;
6+
7+
import org.hibernate.HibernateException;
8+
import org.hibernate.engine.spi.SharedSessionContractImplementor;
9+
import org.hibernate.engine.spi.TransactionCompletionCallbacks.BeforeCompletionCallback;
10+
11+
/**
12+
* Encapsulates behavior needed for before transaction processing
13+
*/
14+
public class BeforeTransactionCompletionProcessQueue
15+
extends AbstractTransactionCompletionProcessQueue<BeforeCompletionCallback> {
16+
17+
public BeforeTransactionCompletionProcessQueue(SharedSessionContractImplementor session) {
18+
super( session );
19+
}
20+
21+
public void beforeTransactionCompletion() {
22+
BeforeCompletionCallback process;
23+
while ( (process = processes.poll()) != null ) {
24+
try {
25+
process.doBeforeTransactionCompletion( session );
26+
}
27+
catch (HibernateException he) {
28+
throw he;
29+
}
30+
catch (Exception e) {
31+
throw new HibernateException(
32+
"Unable to perform beforeTransactionCompletion callback: " + e.getMessage(), e );
33+
}
34+
}
35+
}
36+
}

0 commit comments

Comments
 (0)