Skip to content

Commit 735f066

Browse files
committed
HHH-18642 Revert to Statement.RETURN_GENERATED_KEYS for identity only
1 parent 0c8ac1c commit 735f066

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DB2LegacyDialect.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,6 +1057,19 @@ public IdentityColumnSupport getIdentityColumnSupport() {
10571057
return DB2IdentityColumnSupport.INSTANCE;
10581058
}
10591059

1060+
/**
1061+
* @return {@code true} because we can use {@code select ... from new table (insert .... )}
1062+
*/
1063+
@Override
1064+
public boolean supportsInsertReturning() {
1065+
return true;
1066+
}
1067+
1068+
@Override
1069+
public boolean supportsInsertReturningRowId() {
1070+
return false;
1071+
}
1072+
10601073
@Override
10611074
public boolean supportsValuesList() {
10621075
return true;

hibernate-core/src/main/java/org/hibernate/id/IdentityGenerator.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,18 @@
66
*/
77
package org.hibernate.id;
88

9+
import java.util.List;
10+
911
import org.hibernate.boot.spi.SessionFactoryOptions;
1012
import org.hibernate.dialect.Dialect;
11-
import org.hibernate.engine.spi.SessionFactoryImplementor;
1213
import org.hibernate.generator.OnExecutionGenerator;
1314
import org.hibernate.id.factory.spi.StandardGenerator;
1415
import org.hibernate.id.insert.BasicSelectingDelegate;
1516
import org.hibernate.id.insert.GetGeneratedKeysDelegate;
1617
import org.hibernate.id.insert.InsertGeneratedIdentifierDelegate;
1718
import org.hibernate.id.insert.InsertReturningDelegate;
1819
import org.hibernate.id.insert.UniqueKeySelectingDelegate;
20+
import org.hibernate.metamodel.mapping.ModelPart;
1921

2022
import static org.hibernate.generator.EventType.INSERT;
2123
import static org.hibernate.generator.internal.NaturalIdHelper.getNaturalIdPropertyNames;
@@ -54,11 +56,16 @@ public String[] getReferencedColumnValues(Dialect dialect) {
5456

5557
@Override
5658
public InsertGeneratedIdentifierDelegate getGeneratedIdentifierDelegate(PostInsertIdentityPersister persister) {
57-
final SessionFactoryImplementor factory = persister.getFactory();
58-
final Dialect dialect = factory.getJdbcServices().getDialect();
59+
final Dialect dialect = persister.getFactory().getJdbcServices().getDialect();
60+
final SessionFactoryOptions sessionFactoryOptions = persister.getFactory().getSessionFactoryOptions();
61+
final List<? extends ModelPart> generatedProperties = persister.getGeneratedProperties( INSERT );
62+
if ( generatedProperties.size() == 1 && sessionFactoryOptions.isGetGeneratedKeysEnabled() ) {
63+
// Use Connection#prepareStatement(sql, Statement.RETURN_GENERATED_KEYS) when only retrieving identity
64+
assert generatedProperties.get( 0 ).isEntityIdentifierMapping();
65+
return dialect.getIdentityColumnSupport().buildGetGeneratedKeysDelegate( persister );
66+
}
5967
// Try to use generic delegates if the dialects supports them
60-
final SessionFactoryOptions sessionFactoryOptions = factory.getSessionFactoryOptions();
61-
if ( dialect.supportsInsertReturningGeneratedKeys() && sessionFactoryOptions.isGetGeneratedKeysEnabled() ) {
68+
else if ( dialect.supportsInsertReturningGeneratedKeys() && sessionFactoryOptions.isGetGeneratedKeysEnabled() ) {
6269
return new GetGeneratedKeysDelegate( persister, false, INSERT );
6370
}
6471
else if ( dialect.supportsInsertReturning() && noCustomSql( persister, INSERT ) ) {

0 commit comments

Comments
 (0)