Skip to content

Commit 898963f

Browse files
committed
[#1553] Use the same identity generation strategy for all databases
1 parent dade422 commit 898963f

File tree

2 files changed

+12
-16
lines changed

2 files changed

+12
-16
lines changed

hibernate-reactive-core/src/main/java/org/hibernate/reactive/id/insert/ReactiveAbstractReturningDelegate.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
import org.hibernate.dialect.CockroachDialect;
1212
import org.hibernate.dialect.Dialect;
13-
import org.hibernate.dialect.PostgreSQLDialect;
13+
import org.hibernate.dialect.MySQLDialect;
1414
import org.hibernate.dialect.SQLServerDialect;
1515
import org.hibernate.engine.jdbc.mutation.JdbcValueBindings;
1616
import org.hibernate.engine.jdbc.mutation.group.PreparedStatementDetails;
@@ -70,12 +70,13 @@ && instanceOf( getPersister().getFactory().getJdbcServices().getDialect(), Cockr
7070

7171
private static String createInsert(PreparedStatementDetails insertStatementDetails, String identifierColumnName, Dialect dialect) {
7272
final String sqlEnd = " returning " + identifierColumnName;
73-
if ( instanceOf( dialect, PostgreSQLDialect.class ) ) {
74-
return insertStatementDetails.getSqlString() + sqlEnd;
75-
}
76-
if ( instanceOf( dialect, CockroachDialect.class )
77-
&& !insertStatementDetails.getSqlString().endsWith( sqlEnd ) ) {
78-
return insertStatementDetails.getSqlString() + sqlEnd;
73+
if ( instanceOf( dialect, MySQLDialect.class ) ) {
74+
// For some reasons ORM generates a query with an invalid syntax
75+
String sql = insertStatementDetails.getSqlString();
76+
int index = sql.lastIndexOf( sqlEnd );
77+
return index > -1
78+
? sql.substring( 0, index )
79+
: sql;
7980
}
8081
if ( instanceOf( dialect, SQLServerDialect.class ) ) {
8182
String sql = insertStatementDetails.getSqlString();

hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveIdentityGenerator.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
package org.hibernate.reactive.persister.entity.impl;
77

88

9-
import org.hibernate.cfg.AvailableSettings;
109
import org.hibernate.dialect.Dialect;
1110
import org.hibernate.dialect.identity.CockroachDBIdentityColumnSupport;
1211
import org.hibernate.id.IdentityGenerator;
1312
import org.hibernate.id.PostInsertIdentityPersister;
1413
import org.hibernate.id.insert.InsertGeneratedIdentifierDelegate;
14+
import org.hibernate.reactive.id.insert.ReactiveInsertReturningDelegate;
1515
import org.hibernate.reactive.logging.impl.Log;
1616

1717
import static java.lang.invoke.MethodHandles.lookup;
@@ -30,13 +30,8 @@ public class ReactiveIdentityGenerator extends IdentityGenerator {
3030
@Override
3131
public InsertGeneratedIdentifierDelegate getGeneratedIdentifierDelegate(PostInsertIdentityPersister persister) {
3232
Dialect dialect = persister.getFactory().getJdbcServices().getDialect();
33-
boolean generatedKeysEnabled = persister.getFactory().getSessionFactoryOptions().isGetGeneratedKeysEnabled();
34-
if ( !generatedKeysEnabled ) {
35-
LOG.debugf( "Ignoring property `%s`", AvailableSettings.USE_GET_GENERATED_KEYS );
36-
}
37-
// With JDBC, it's possible to select different type of queries for the retrieval of the id after
38-
// an insert. But, we don't need this in Hibernate Reactive, and it's easier to just run the most efficient query
39-
// for the selected database.
40-
return dialect.getIdentityColumnSupport().buildGetGeneratedKeysDelegate( persister, dialect );
33+
// Hibernate ORM allows the selection of different strategies based on the property `hibernate.jdbc.use_get_generated_keys`.
34+
// But that's a specific JDBC property and with Vert.x we only have one viable option for each supported database.
35+
return new ReactiveInsertReturningDelegate( persister, dialect );
4136
}
4237
}

0 commit comments

Comments
 (0)