Skip to content

Commit 5e28128

Browse files
dreab8DavideD
authored andcommitted
[#1906] Support @IdGeneratorType
1 parent a7c2243 commit 5e28128

File tree

4 files changed

+52
-3
lines changed

4 files changed

+52
-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/id/insert/ReactiveAbstractReturningDelegate.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.hibernate.dialect.CockroachDialect;
1313
import org.hibernate.dialect.DB2Dialect;
1414
import org.hibernate.dialect.Dialect;
15+
import org.hibernate.dialect.MariaDBDialect;
1516
import org.hibernate.dialect.MySQLDialect;
1617
import org.hibernate.dialect.OracleDialect;
1718
import org.hibernate.dialect.SQLServerDialect;
@@ -86,6 +87,12 @@ && getPersister().getFactory().getJdbcServices().getDialect() instanceof Cockroa
8687
}
8788

8889
private static String createInsert(String insertSql, String identifierColumnName, Dialect dialect) {
90+
if ( dialect instanceof MariaDBDialect ) {
91+
// The queries for MariDB seem to work fine, we don't have to change them.
92+
// In particular, removing the " returning id" at the end will cause a failure when a column value
93+
// is generated by the database
94+
return insertSql;
95+
}
8996
String sql = insertSql;
9097
final String sqlEnd = " returning " + identifierColumnName;
9198
if ( dialect instanceof MySQLDialect ) {

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)