Skip to content

Commit 02b81ab

Browse files
committed
[#1906] Support @IdGeneratorType
1 parent f9d4c84 commit 02b81ab

File tree

3 files changed

+45
-3
lines changed

3 files changed

+45
-3
lines changed

hibernate-reactive-core/src/main/java/org/hibernate/reactive/id/ReactiveIdentifierGenerator.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@
66
package org.hibernate.reactive.id;
77

88
import org.hibernate.Incubating;
9+
import org.hibernate.engine.spi.SharedSessionContractImplementor;
910
import org.hibernate.generator.EventType;
10-
import org.hibernate.generator.Generator;
1111
import org.hibernate.id.IdentifierGenerator;
12+
import org.hibernate.reactive.logging.impl.Log;
13+
import org.hibernate.reactive.logging.impl.LoggerFactory;
1214
import org.hibernate.reactive.session.ReactiveConnectionSupplier;
1315

16+
import java.lang.invoke.MethodHandles;
1417
import java.util.concurrent.CompletionStage;
1518

1619
/**
@@ -26,7 +29,7 @@
2629
* @see IdentifierGenerator
2730
*/
2831
@Incubating
29-
public interface ReactiveIdentifierGenerator<Id> extends Generator {
32+
public interface ReactiveIdentifierGenerator<Id> extends IdentifierGenerator {
3033

3134
/**
3235
* Returns a generated identifier, via a {@link CompletionStage}.
@@ -38,4 +41,18 @@ public interface ReactiveIdentifierGenerator<Id> extends Generator {
3841
default CompletionStage<Id> generate(ReactiveConnectionSupplier session, Object owner, Object currentValue, EventType eventType) {
3942
return generate( session, owner );
4043
}
44+
45+
@Override
46+
default Id generate(
47+
SharedSessionContractImplementor session,
48+
Object owner,
49+
Object currentValue,
50+
EventType eventType){
51+
throw LoggerFactory.make( Log.class, MethodHandles.lookup() ).nonReactiveMethodCall( "generate(ReactiveConnectionSupplier, Object, Object, EventType)" );
52+
}
53+
54+
@Override
55+
default Object generate(SharedSessionContractImplementor session, Object object){
56+
throw LoggerFactory.make( Log.class, MethodHandles.lookup() ).nonReactiveMethodCall( "generate(ReactiveConnectionSupplier, Object)" );
57+
}
4158
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/* Hibernate, Relational Persistence for Idiomatic Java
2+
*
3+
* SPDX-License-Identifier: Apache-2.0
4+
* Copyright: Red Hat Inc. and Hibernate Authors
5+
*/
6+
package org.hibernate.reactive.id;
7+
8+
import org.hibernate.dialect.Dialect;
9+
import org.hibernate.generator.OnExecutionGenerator;
10+
import org.hibernate.id.insert.InsertGeneratedIdentifierDelegate;
11+
import org.hibernate.persister.entity.EntityPersister;
12+
import org.hibernate.reactive.id.insert.ReactiveInsertReturningDelegate;
13+
14+
public interface ReactiveOnExecutionGenerator extends OnExecutionGenerator {
15+
16+
@Override
17+
default InsertGeneratedIdentifierDelegate getGeneratedIdentifierDelegate(EntityPersister persister) {
18+
Dialect dialect = persister.getFactory().getJdbcServices().getDialect();
19+
// Hibernate ORM allows the selection of different strategies based on the property `hibernate.jdbc.use_get_generated_keys`.
20+
// But that's a specific JDBC property and with Vert.x we only have one viable option for each supported database.
21+
return new ReactiveInsertReturningDelegate( persister, dialect );
22+
}
23+
24+
}

hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
import org.hibernate.reactive.query.sql.spi.ReactiveNativeQueryImplementor;
7171
import org.hibernate.reactive.query.sqm.internal.ReactiveQuerySqmImpl;
7272
import org.hibernate.reactive.query.sqm.internal.ReactiveSqmSelectionQueryImpl;
73+
import org.hibernate.reactive.session.ReactiveConnectionSupplier;
7374
import org.hibernate.reactive.session.ReactiveSqmQueryImplementor;
7475
import org.hibernate.reactive.session.ReactiveStatelessSession;
7576
import org.hibernate.reactive.util.impl.CompletionStages.Completable;
@@ -438,7 +439,7 @@ private CompletionStage<?> generatedIdBeforeInsert(
438439

439440
private CompletionStage<?> generateIdForInsert(Object entity, Generator generator, ReactiveEntityPersister persister) {
440441
if ( generator instanceof ReactiveIdentifierGenerator<?> reactiveGenerator ) {
441-
return reactiveGenerator.generate( this, this )
442+
return reactiveGenerator.generate( (ReactiveConnectionSupplier) this, this )
442443
.thenApply( id -> castToIdentifierType( id, persister ) );
443444
}
444445

0 commit comments

Comments
 (0)