Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,13 @@

import java.util.concurrent.CompletionStage;

import org.hibernate.DetachedObjectException;
import org.hibernate.HibernateException;
import org.hibernate.LockMode;
import org.hibernate.LockOptions;
import org.hibernate.ObjectDeletedException;
import org.hibernate.TransientObjectException;
import org.hibernate.cache.spi.access.EntityDataAccess;
import org.hibernate.cache.spi.access.SoftLock;
import org.hibernate.engine.internal.CascadePoint;
import org.hibernate.engine.spi.EntityEntry;
import org.hibernate.engine.spi.PersistenceContext;
import org.hibernate.engine.spi.SessionImplementor;
Expand All @@ -24,9 +23,6 @@
import org.hibernate.event.spi.LockEventListener;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.reactive.engine.ReactiveActionQueue;
import org.hibernate.reactive.engine.impl.Cascade;
import org.hibernate.reactive.engine.impl.CascadingActions;
import org.hibernate.reactive.engine.impl.ForeignKeys;
import org.hibernate.reactive.engine.impl.ReactiveEntityIncrementVersionProcess;
import org.hibernate.reactive.engine.impl.ReactiveEntityVerifyVersionProcess;
import org.hibernate.reactive.event.ReactiveLockEventListener;
Expand All @@ -38,8 +34,6 @@
import static java.lang.invoke.MethodHandles.lookup;
import static org.hibernate.pretty.MessageHelper.infoString;
import static org.hibernate.reactive.logging.impl.LoggerFactory.make;
import static org.hibernate.reactive.util.impl.CompletionStages.completedFuture;
import static org.hibernate.reactive.util.impl.CompletionStages.failedFuture;
import static org.hibernate.reactive.util.impl.CompletionStages.voidFuture;

public class DefaultReactiveLockEventListener extends DefaultLockEventListener implements LockEventListener, ReactiveLockEventListener {
Expand All @@ -53,15 +47,17 @@ public void onLock(LockEvent event) throws HibernateException {

@Override
public CompletionStage<Void> reactiveOnLock(LockEvent event) throws HibernateException {
if ( event.getObject() == null ) {
final Object instance = event.getObject();
if ( instance == null ) {
throw new NullPointerException( "attempted to lock null" );
}

if ( event.getLockMode() == LockMode.WRITE ) {
final var lockMode = event.getLockMode();
if ( lockMode == LockMode.WRITE ) {
throw LOG.invalidLockModeForLock();
}

if ( event.getLockMode() == LockMode.UPGRADE_SKIPLOCKED ) {
if ( lockMode == LockMode.UPGRADE_SKIPLOCKED ) {
LOG.explicitSkipLockedLockCombo();
}

Expand All @@ -80,54 +76,20 @@ public CompletionStage<Void> reactiveOnLock(LockEvent event) throws HibernateExc
//TODO: if object was an uninitialized proxy, this is inefficient,
// resulting in two SQL selects

return ( (ReactiveQueryProducer) source ).reactiveFetch( event.getObject(), true )
return ( (ReactiveQueryProducer) source ).reactiveFetch( instance, true )
.thenCompose( entity -> reactiveOnLock( event, entity ) );
}

private CompletionStage<Void> reactiveOnLock(LockEvent event, Object entity) {
final SessionImplementor source = event.getSession();
final PersistenceContext persistenceContext = source.getPersistenceContextInternal();
final EntityEntry entry = persistenceContext.getEntry( entity );
return lockEntry( event, entity, entry, source )
.thenCompose( e -> upgradeLock( entity, e, event.getLockOptions(), event.getSession() ) );
}

private CompletionStage<EntityEntry> lockEntry(
LockEvent event,
Object entity,
EntityEntry entry,
SessionImplementor source) {
if ( entry == null ) {
final EntityPersister persister = source.getEntityPersister( event.getEntityName(), entity );
final Object id = persister.getIdentifier( entity, source );
return ForeignKeys
.isNotTransient( event.getEntityName(), entity, Boolean.FALSE, source )
.thenCompose( trans -> {
if ( !trans ) {
return failedFuture( new TransientObjectException(
"Cannot lock unsaved transient instance of entity '" + persister.getEntityName() + "'"
) );
}

final EntityEntry e = reassociate( event, entity, id, persister );
return cascadeOnLock( event, persister, entity )
.thenApply( v -> e );
}
);
if ( entry == null && event.getObject() == entity ) {
throw new DetachedObjectException( "Given entity is not associated with the persistence context" );
}
return completedFuture( entry );
return upgradeLock( entity, entry, event.getLockOptions(), event.getSession() );
}

private CompletionStage<Void> cascadeOnLock(LockEvent event, EntityPersister persister, Object entity) {
return Cascade.cascade(
CascadingActions.LOCK,
CascadePoint.AFTER_LOCK,
event.getSession(),
persister,
entity,
event.getLockOptions()
);
}

/**
* Performs a pessimistic lock upgrade on a given entity, if needed.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;

import org.hibernate.DetachedObjectException;
import org.hibernate.HibernateException;
import org.hibernate.LockMode;
import org.hibernate.LockOptions;
import org.hibernate.PersistentObjectException;
import org.hibernate.UnresolvableObjectException;
import org.hibernate.cache.spi.access.CollectionDataAccess;
import org.hibernate.cache.spi.access.EntityDataAccess;
Expand Down Expand Up @@ -110,21 +110,7 @@ private CompletionStage<Void> reactiveOnRefresh(RefreshEvent event, RefreshConte
final EntityPersister persister;
final Object id;
if ( entry == null ) {
//refresh() does not pass an entityName
persister = source.getEntityPersister( event.getEntityName(), entity );
id = persister.getIdentifier( entity, event.getSession() );
if ( LOG.isTraceEnabled() ) {
LOG.tracev(
"Refreshing transient {0}",
infoString( persister, id, source.getFactory() )
);
}
if ( persistenceContext.getEntry( source.generateEntityKey( id, persister ) ) != null ) {
throw new PersistentObjectException(
"attempted to refresh transient instance when persistent instance was already associated with the session: "
+ infoString( persister, id, source.getFactory() )
);
}
throw new DetachedObjectException( "Given entity is not associated with the persistence context" );
}
else {
if ( LOG.isTraceEnabled() ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,11 @@
import org.hibernate.sql.ast.tree.select.QuerySpec;
import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.internal.BaseExecutionContext;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.exec.spi.JdbcSelect;
import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.FetchParent;
import org.hibernate.sql.results.graph.internal.ImmutableFetchList;
Expand All @@ -56,7 +56,7 @@ class DatabaseSnapshotExecutor {

private final EntityMappingType entityDescriptor;

private final JdbcOperationQuerySelect jdbcSelect;
private final JdbcSelect jdbcSelect;
private final JdbcParametersList jdbcParameters;

DatabaseSnapshotExecutor(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
import org.hibernate.reactive.util.impl.CompletionStages;
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcSelect;
import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl;
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
Expand All @@ -46,7 +46,7 @@ public class ReactiveCollectionBatchLoaderArrayParam extends ReactiveAbstractCol
private final JdbcMapping arrayJdbcMapping;
private final JdbcParameter jdbcParameter;
private final SelectStatement sqlSelect;
private final JdbcOperationQuerySelect jdbcSelectOperation;
private final JdbcSelect jdbcSelectOperation;

public ReactiveCollectionBatchLoaderArrayParam(
int domainBatchSize,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.query.spi.QueryOptions;
import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcSelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;

Expand All @@ -36,7 +36,7 @@ public class ReactiveCollectionBatchLoaderInPredicate extends ReactiveAbstractCo
private final int sqlBatchSize;
private final JdbcParametersList jdbcParameters;
private final SelectStatement sqlAst;
private final JdbcOperationQuerySelect jdbcSelect;
private final JdbcSelect jdbcSelect;

private ReactiveCollectionLoaderSingleKey singleKeyLoader;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.internal.BaseExecutionContext;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.exec.spi.JdbcSelect;
import org.hibernate.sql.results.internal.RowTransformerStandardImpl;

/**
Expand Down Expand Up @@ -98,7 +98,7 @@ public CompletionStage<PersistentCollection<?>> reactiveLoad(Object key, SharedS
);
assert offset == jdbcParameters.size();

final JdbcOperationQuerySelect jdbcSelect = sqlAstTranslatorFactory
final JdbcSelect jdbcSelect = sqlAstTranslatorFactory
.buildSelectTranslator( sessionFactory, sqlAst )
.translate( jdbcParameterBindings, QueryOptions.NONE );

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
import org.hibernate.reactive.sql.exec.internal.StandardReactiveSelectExecutor;
import org.hibernate.reactive.sql.results.spi.ReactiveListResultsConsumer;
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcSelect;
import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.internal.ResultsHelper;
import org.hibernate.sql.results.internal.RowTransformerStandardImpl;
Expand Down Expand Up @@ -84,7 +84,7 @@ public CompletionStage<PersistentCollection<?>> reactiveLoad(Object triggerKey,
}
}

final JdbcOperationQuerySelect jdbcSelect = sqlAstTranslatorFactory
final JdbcSelect jdbcSelect = sqlAstTranslatorFactory
.buildSelectTranslator( sessionFactory, getSqlAst() )
.translate( this.subselect.getLoadingJdbcParameterBindings(), QueryOptions.NONE );

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@
import org.hibernate.reactive.loader.ast.spi.ReactiveSingleIdEntityLoader;
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcSelect;

import static org.hibernate.loader.ast.internal.MultiKeyLoadLogging.MULTI_KEY_LOAD_LOGGER;

Expand All @@ -43,7 +43,7 @@ public class ReactiveEntityBatchLoaderArrayParam<T> extends ReactiveSingleIdEnti
private JdbcMapping arrayJdbcMapping;
private JdbcParameter jdbcParameter;
private SelectStatement sqlAst;
private JdbcOperationQuerySelect jdbcSelectOperation;
private JdbcSelect jdbcSelectOperation;

public ReactiveEntityBatchLoaderArrayParam(
int domainBatchSize,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@
import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.query.spi.QueryOptions;
import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.exec.spi.JdbcSelect;

import static org.hibernate.internal.util.collections.CollectionHelper.arrayList;
import static org.hibernate.loader.ast.internal.MultiKeyLoadLogging.MULTI_KEY_LOAD_LOGGER;
Expand All @@ -41,7 +41,7 @@ public class ReactiveEntityBatchLoaderInPredicate<T> extends ReactiveSingleIdEnt

private JdbcParametersList jdbcParameters;
private SelectStatement sqlAst;
private JdbcOperationQuerySelect jdbcSelectOperation;
private JdbcSelect jdbcSelectOperation;

/**
* @param domainBatchSize The maximum number of entities we will initialize for each {@link #load load}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@
import org.hibernate.reactive.sql.results.spi.ReactiveListResultsConsumer;
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl;
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.exec.spi.JdbcSelect;
import org.hibernate.sql.results.internal.RowTransformerStandardImpl;

import static java.util.Objects.requireNonNull;
Expand Down Expand Up @@ -67,7 +67,7 @@ public static <X> X[] createTypedArray(Class<X> elementClass, @SuppressWarnings(
public static <R, K> CompletionStage<List<R>> loadByArrayParameter(
K[] idsToInitialize,
SelectStatement sqlAst,
JdbcOperationQuerySelect jdbcOperation,
JdbcSelect jdbcOperation,
JdbcParameter jdbcParameter,
JdbcMapping arrayJdbcMapping,
Object entityId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,12 @@
import org.hibernate.reactive.sql.results.spi.ReactiveListResultsConsumer;
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl;
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.exec.spi.JdbcSelect;
import org.hibernate.sql.results.internal.RowTransformerStandardImpl;

import static org.hibernate.event.spi.LoadEventListener.GET;
Expand Down Expand Up @@ -160,7 +160,7 @@ protected <K> CompletionStage<List<E>> performOrderedMultiLoad(
jdbcParameter,
getSessionFactory()
);
final JdbcOperationQuerySelect jdbcSelectOperation = getSessionFactory().getJdbcServices()
final JdbcSelect jdbcSelectOperation = getSessionFactory().getJdbcServices()
.getJdbcEnvironment()
.getSqlAstTranslatorFactory()
.buildSelectTranslator( getSessionFactory(), sqlAst )
Expand Down Expand Up @@ -262,7 +262,7 @@ protected <K> CompletionStage<List<E>> performUnorderedMultiLoad(
getSessionFactory()
);

final JdbcOperationQuerySelect jdbcSelectOperation = getSessionFactory().getJdbcServices()
final JdbcSelect jdbcSelectOperation = getSessionFactory().getJdbcServices()
.getJdbcEnvironment()
.getSqlAstTranslatorFactory()
.buildSelectTranslator( getSessionFactory(), sqlAst )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@
import org.hibernate.reactive.util.impl.CompletionStages;
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.exec.spi.JdbcSelect;
import org.hibernate.sql.results.internal.RowTransformerStandardImpl;

import static org.hibernate.event.spi.LoadEventListener.GET;
Expand Down Expand Up @@ -244,7 +244,7 @@ private CompletionStage<List<T>> loadEntitiesById(

// we should have used all the JdbcParameter references (created bindings for all)
assert offset == jdbcParameters.size();
final JdbcOperationQuerySelect jdbcSelect = sqlAstTranslatorFactory
final JdbcSelect jdbcSelect = sqlAstTranslatorFactory
.buildSelectTranslator( getSessionFactory(), sqlAst )
.translate( jdbcParameterBindings, QueryOptions.NONE );

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@
import org.hibernate.reactive.sql.exec.internal.StandardReactiveSelectExecutor;
import org.hibernate.reactive.sql.results.spi.ReactiveListResultsConsumer;
import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.spi.ExecutionContext;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.exec.spi.JdbcSelect;
import org.hibernate.sql.results.internal.RowTransformerStandardImpl;

import static org.hibernate.reactive.util.impl.CompletionStages.voidFuture;
Expand Down Expand Up @@ -53,15 +53,15 @@ interface ChunkBoundaryListener {

private final JdbcParametersList jdbcParameters;
private final SelectStatement sqlAst;
private final JdbcOperationQuerySelect jdbcSelect;
private final JdbcSelect jdbcSelect;

public ReactiveMultiKeyLoadChunker(
int chunkSize,
int keyColumnCount,
Bindable bindable,
JdbcParametersList jdbcParameters,
SelectStatement sqlAst,
JdbcOperationQuerySelect jdbcSelect) {
JdbcSelect jdbcSelect) {
this.chunkSize = chunkSize;
this.keyColumnCount = keyColumnCount;
this.bindable = bindable;
Expand Down
Loading