Skip to content
Closed
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
6 changes: 3 additions & 3 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -31,22 +31,22 @@ org.gradle.java.installations.auto-download=false
#db = MSSQL

# Enable the maven Central Snapshot repository, when set to any value (the value is ignored)
#enableCentralSonatypeSnapshotsRep = true
enableCentralSonatypeSnapshotsRep = true

# Enable the maven local repository (for local development when needed) when present (value ignored)
#enableMavenLocalRepo = true

### Settings the following properties will override the version defined in gradle/libs.versions.toml

# The default Hibernate ORM version (override using `-PhibernateOrmVersion=the.version.you.want`)
#hibernateOrmVersion = 7.1.0.Final
hibernateOrmVersion = 7.2.+

# Override default Hibernate ORM Gradle plugin version
#hibernateOrmGradlePluginVersion = 7.1.0.Final

# If set to true, skip Hibernate ORM version parsing (default is true, if set to null)
# this is required when using intervals or weird versions or the build will fail
#skipOrmVersionParsing = true
skipOrmVersionParsing = true

# Override default Vert.x Sql client version
#vertxSqlClientVersion = 5.0.2-SNAPSHOT
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ public CompletionStage<Void> reactiveExecute() throws HibernateException {
.thenAccept( v -> {
handleDeleted( entry );
updateCacheItem( persister, ck, entry );
handleNaturalIdResolutions( persister, session, id );
handleNaturalIdSharedResolutions( id, persister, session.getPersistenceContext() );
postUpdate();

final StatisticsImplementor statistics = session.getFactory().getStatistics();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ private static void evictEntity(Object entity, EntityPersister persister, Object
);
final SoftLock lock = cache.lockItem( source, ck, previousVersion );
cache.remove(source, ck );
source.getActionQueue().registerProcess( (success, session) -> cache.unlockItem( session, ck, lock ) );
source.getActionQueue().registerCallback( (success, session) -> cache.unlockItem( session, ck, lock ) );
}
}

Expand Down Expand Up @@ -314,7 +314,7 @@ private void evictCachedCollections(Type[] types, Object id, EventSource source)
);
final SoftLock lock = cache.lockItem( source, ck, null );
cache.remove( source, ck );
actionQueue.registerProcess( (success, session) -> cache.unlockItem( session, ck, lock ) );
actionQueue.registerCallback( (success, session) -> cache.unlockItem( session, ck, lock ) );
}
}
else if ( type.isComponentType() ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,38 @@
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.generator.EventType;
import org.hibernate.generator.Generator;
import org.hibernate.generator.GeneratorCreationContext;
import org.hibernate.generator.values.GeneratedValueBasicResultBuilder;
import org.hibernate.generator.values.GeneratedValues;
import org.hibernate.generator.values.GeneratedValuesMutationDelegate;
import org.hibernate.generator.values.internal.GeneratedValuesHelper;
import org.hibernate.generator.values.internal.GeneratedValuesImpl;
import org.hibernate.generator.values.internal.GeneratedValuesMappingProducer;
import org.hibernate.id.IdentifierGeneratorHelper;
import org.hibernate.id.CompositeNestedGeneratedValueGenerator;
import org.hibernate.id.Configurable;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.id.SelectGenerator;
import org.hibernate.id.enhanced.DatabaseStructure;
import org.hibernate.id.enhanced.SequenceStructure;
import org.hibernate.id.enhanced.SequenceStyleGenerator;
import org.hibernate.id.enhanced.TableGenerator;
import org.hibernate.id.enhanced.TableStructure;
import org.hibernate.id.insert.GetGeneratedKeysDelegate;
import org.hibernate.id.insert.UniqueKeySelectingDelegate;
import org.hibernate.internal.CoreLogging;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.metamodel.mapping.ModelPart;
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.pretty.MessageHelper;
import org.hibernate.query.spi.QueryOptions;
import org.hibernate.reactive.id.ReactiveIdentifierGenerator;
import org.hibernate.reactive.id.impl.EmulatedSequenceReactiveIdentifierGenerator;
import org.hibernate.reactive.id.impl.ReactiveCompositeNestedGeneratedValueGenerator;
import org.hibernate.reactive.id.impl.ReactiveGeneratorWrapper;
import org.hibernate.reactive.id.impl.ReactiveSequenceIdentifierGenerator;
import org.hibernate.reactive.id.impl.TableReactiveIdentifierGenerator;
import org.hibernate.reactive.id.insert.ReactiveInsertReturningDelegate;
import org.hibernate.reactive.logging.impl.Log;
import org.hibernate.reactive.sql.exec.spi.ReactiveRowProcessingState;
import org.hibernate.reactive.sql.exec.spi.ReactiveValuesResultSet;
import org.hibernate.reactive.sql.results.internal.ReactiveDirectResultSetAccess;
Expand All @@ -48,16 +64,18 @@
import java.util.List;
import java.util.concurrent.CompletionStage;

import static java.lang.invoke.MethodHandles.lookup;
import static org.hibernate.generator.values.internal.GeneratedValuesHelper.noCustomSql;
import static org.hibernate.internal.NaturalIdHelper.getNaturalIdPropertyNames;
import static org.hibernate.reactive.logging.impl.LoggerFactory.make;
import static org.hibernate.reactive.sql.results.spi.ReactiveListResultsConsumer.UniqueSemantic.NONE;

/**
* @see org.hibernate.generator.values.internal.GeneratedValuesHelper
*/
@Internal
public class ReactiveGeneratedValuesHelper {
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( IdentifierGeneratorHelper.class );
private static final Log LOG = make( Log.class, lookup() );

/**
*
Expand Down Expand Up @@ -225,4 +243,53 @@ public boolean shouldReturnProxies() {
return results.get( 0 );
} );
}

public static Generator augmentWithReactiveGenerator(
Generator generator,
GeneratorCreationContext creationContext,
RuntimeModelCreationContext runtimeModelCreationContext) {
if ( generator instanceof SequenceStyleGenerator sequenceStyleGenerator) {
final DatabaseStructure structure = sequenceStyleGenerator.getDatabaseStructure();
if ( structure instanceof TableStructure ) {
return initialize( (IdentifierGenerator) generator, new EmulatedSequenceReactiveIdentifierGenerator( (TableStructure) structure, runtimeModelCreationContext ), creationContext );
}
if ( structure instanceof SequenceStructure ) {
return initialize( (IdentifierGenerator) generator, new ReactiveSequenceIdentifierGenerator( structure, runtimeModelCreationContext ), creationContext );
}
throw LOG.unknownStructureType();
}
if ( generator instanceof TableGenerator tableGenerator ) {
return initialize(
(IdentifierGenerator) generator,
new TableReactiveIdentifierGenerator( tableGenerator, runtimeModelCreationContext ),
creationContext
);
}
if ( generator instanceof SelectGenerator ) {
throw LOG.selectGeneratorIsNotSupportedInHibernateReactive();
}
if ( generator instanceof CompositeNestedGeneratedValueGenerator compositeNestedGeneratedValueGenerator ) {
final ReactiveCompositeNestedGeneratedValueGenerator reactiveCompositeNestedGeneratedValueGenerator = new ReactiveCompositeNestedGeneratedValueGenerator(
compositeNestedGeneratedValueGenerator,
creationContext,
runtimeModelCreationContext
);
return initialize(
(IdentifierGenerator) generator,
reactiveCompositeNestedGeneratedValueGenerator,
creationContext
);
}
//nothing to do
return generator;
}

private static Generator initialize(
IdentifierGenerator idGenerator,
ReactiveIdentifierGenerator<?> reactiveIdGenerator,
GeneratorCreationContext creationContext) {
( (Configurable) reactiveIdGenerator ).initialize( creationContext.getSqlStringGenerationContext() );
return new ReactiveGeneratorWrapper( reactiveIdGenerator, idGenerator );
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@
import org.hibernate.id.IdentifierGenerationException;
import org.hibernate.mapping.Component;
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
import org.hibernate.reactive.generator.values.internal.ReactiveGeneratedValuesHelper;
import org.hibernate.reactive.id.ReactiveIdentifierGenerator;
import org.hibernate.reactive.session.ReactiveConnectionSupplier;
import org.hibernate.reactive.tuple.entity.ReactiveEntityMetamodel;

import java.util.ArrayList;
import java.util.List;
Expand Down Expand Up @@ -46,7 +46,7 @@ private static List<GenerationPlan> reactivePlans(
final List<GenerationPlan> plans = new ArrayList<>();
for ( GenerationPlan plan : generator.getGenerationPlans() ) {
final GenerationPlan reactivePlane = new Component.ValueGenerationPlan(
(BeforeExecutionGenerator) ReactiveEntityMetamodel.augmentWithReactiveGenerator(
(BeforeExecutionGenerator) ReactiveGeneratedValuesHelper.augmentWithReactiveGenerator(
plan.getGenerator(),
creationContext,
runtimeModelCreationContext
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@
*/
package org.hibernate.reactive.metamodel.mapping.internal;

import java.util.Map;

import org.hibernate.boot.model.relational.Database;
import org.hibernate.boot.model.relational.SqlStringGenerationContext;
import org.hibernate.boot.spi.BootstrapContext;
import org.hibernate.boot.spi.MetadataImplementor;
Expand All @@ -16,31 +15,37 @@
import org.hibernate.engine.jdbc.spi.JdbcServices;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.generator.Generator;
import org.hibernate.generator.GeneratorCreationContext;
import org.hibernate.mapping.GeneratorSettings;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property;
import org.hibernate.mapping.RootClass;
import org.hibernate.mapping.SimpleValue;
import org.hibernate.metamodel.spi.MappingMetamodelImplementor;
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.query.sqm.function.SqmFunctionRegistry;
import org.hibernate.reactive.tuple.entity.ReactiveEntityMetamodel;
import org.hibernate.reactive.logging.impl.Log;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.tuple.entity.EntityMetamodel;
import org.hibernate.type.Type;
import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry;
import org.hibernate.type.spi.TypeConfiguration;

import java.util.Map;

import static java.lang.invoke.MethodHandles.lookup;
import static org.hibernate.reactive.generator.values.internal.ReactiveGeneratedValuesHelper.augmentWithReactiveGenerator;
import static org.hibernate.reactive.logging.impl.LoggerFactory.make;

public class ReactiveRuntimeModelCreationContext implements RuntimeModelCreationContext {

private static final Log LOG = make( Log.class, lookup() );

private final RuntimeModelCreationContext delegate;

public ReactiveRuntimeModelCreationContext(RuntimeModelCreationContext delegate) {
this.delegate = delegate;
}

@Override
public EntityMetamodel createEntityMetamodel(PersistentClass persistentClass, EntityPersister persister) {
return new ReactiveEntityMetamodel( persistentClass, persister, delegate );
}

@Override
public SessionFactoryImplementor getSessionFactory() {
return delegate.getSessionFactory();
Expand Down Expand Up @@ -125,4 +130,86 @@ public Map<String, Generator> getGenerators() {
public GeneratorSettings getGeneratorSettings() {
return delegate.getGeneratorSettings();
}

@Override
public Generator getOrCreateIdGenerator(String rootName, PersistentClass persistentClass){
final Generator existing = getGenerators().get( rootName );
if ( existing != null ) {
return existing;
}
else {
final SimpleValue identifier = (SimpleValue) persistentClass.getIdentifier();
final Generator idgenerator = augmentWithReactiveGenerator(
identifier.createGenerator(
getDialect(),
persistentClass.getRootClass(),
persistentClass.getIdentifierProperty(),
getGeneratorSettings()
),
new IdGeneratorCreationContext(
persistentClass.getRootClass(),
persistentClass.getIdentifierProperty(),
getGeneratorSettings(),
identifier,
this
),
this );
getGenerators().put( rootName, idgenerator );
return idgenerator;
}
}

private record IdGeneratorCreationContext(
RootClass rootClass,
Property property,
GeneratorSettings defaults,
SimpleValue identifier,
RuntimeModelCreationContext buildingContext) implements GeneratorCreationContext {

@Override
public Database getDatabase() {
return buildingContext.getBootModel().getDatabase();
}

@Override
public ServiceRegistry getServiceRegistry() {
return buildingContext.getBootstrapContext().getServiceRegistry();
}

@Override
public SqlStringGenerationContext getSqlStringGenerationContext() {
return defaults.getSqlStringGenerationContext();
}

@Override
public String getDefaultCatalog() {
return defaults.getDefaultCatalog();
}

@Override
public String getDefaultSchema() {
return defaults.getDefaultSchema();
}

@Override
public RootClass getRootClass() {
return rootClass;
}

@Override
public PersistentClass getPersistentClass() {
return rootClass;
}

@Override
public Property getProperty() {
return property;
}

@Override
public Type getType() {
return identifier.getType();
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
import java.util.function.Supplier;

import org.hibernate.Cache;
import org.hibernate.internal.SessionCreationOptions;
import org.hibernate.engine.creation.internal.SessionBuilderImpl;
import org.hibernate.engine.creation.internal.SessionCreationOptions;
import org.hibernate.internal.SessionFactoryImpl;
import org.hibernate.query.criteria.HibernateCriteriaBuilder;
import org.hibernate.reactive.common.spi.Implementor;
Expand Down Expand Up @@ -133,12 +134,12 @@
}

private SessionCreationOptions options() {
return new SessionFactoryImpl.SessionBuilderImpl( delegate );
return new SessionBuilderImpl( delegate );
}

private SessionCreationOptions options(String tenantIdentifier) {
return new SessionFactoryImpl.SessionBuilderImpl( delegate )
return (SessionCreationOptions) new SessionBuilderImpl( delegate )
.tenantIdentifier( tenantIdentifier );

Check notice

Code scanning / CodeQL

Deprecated method or constructor invocation Note

Invoking
SessionBuilderImpl.tenantIdentifier
should be avoided because it has been deprecated.
}

private CompletionStage<ReactiveConnection> connection(String tenantId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import org.hibernate.boot.registry.StandardServiceInitiator;
import org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator;
import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl;
import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProvider;
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
import org.hibernate.service.spi.ServiceRegistryImplementor;

Expand All @@ -28,7 +28,7 @@ public class NoJdbcConnectionProviderInitiator implements StandardServiceInitiat
@Override
public ConnectionProvider initiateService(Map configurationValues, ServiceRegistryImplementor registry) {
ConnectionProvider provider = ConnectionProviderInitiator.INSTANCE.initiateService(configurationValues, registry);
if (provider instanceof DriverManagerConnectionProviderImpl) {
if ( provider instanceof DriverManagerConnectionProvider ) {
return NoJdbcConnectionProvider.INSTANCE;
}
return provider;
Expand Down
Loading
Loading