Skip to content

Commit 772ec27

Browse files
committed
HHH-18642 Enable getGeneratedKeys() for arbitrary attributes on DB2
Also revert to Statement.RETURN_GENERATED_KEYS when selecting identity only
1 parent f929a78 commit 772ec27

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,6 +1060,24 @@ public IdentityColumnSupport getIdentityColumnSupport() {
10601060
return DB2IdentityColumnSupport.INSTANCE;
10611061
}
10621062

1063+
@Override
1064+
public boolean supportsInsertReturningGeneratedKeys() {
1065+
return true;
1066+
}
1067+
1068+
/**
1069+
* @return {@code true} because we can use {@code select ... from new table (insert .... )}
1070+
*/
1071+
@Override
1072+
public boolean supportsInsertReturning() {
1073+
return true;
1074+
}
1075+
1076+
@Override
1077+
public boolean supportsInsertReturningRowId() {
1078+
return false;
1079+
}
1080+
10631081
@Override
10641082
public boolean supportsValuesList() {
10651083
return true;

hibernate-core/src/main/java/org/hibernate/dialect/DB2Dialect.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,6 +1127,11 @@ public IdentityColumnSupport getIdentityColumnSupport() {
11271127
return DB2IdentityColumnSupport.INSTANCE;
11281128
}
11291129

1130+
@Override
1131+
public boolean supportsInsertReturningGeneratedKeys() {
1132+
return true;
1133+
}
1134+
11301135
/**
11311136
* @return {@code true} because we can use {@code select ... from new table (insert .... )}
11321137
*/

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,17 @@
44
*/
55
package org.hibernate.id;
66

7+
import java.util.List;
8+
79
import org.hibernate.boot.spi.SessionFactoryOptions;
810
import org.hibernate.dialect.Dialect;
9-
import org.hibernate.engine.spi.SessionFactoryImplementor;
1011
import org.hibernate.generator.OnExecutionGenerator;
1112
import org.hibernate.id.insert.BasicSelectingDelegate;
1213
import org.hibernate.id.insert.GetGeneratedKeysDelegate;
1314
import org.hibernate.id.insert.InsertGeneratedIdentifierDelegate;
1415
import org.hibernate.id.insert.InsertReturningDelegate;
1516
import org.hibernate.id.insert.UniqueKeySelectingDelegate;
17+
import org.hibernate.metamodel.mapping.ModelPart;
1618
import org.hibernate.persister.entity.EntityPersister;
1719

1820
import static org.hibernate.generator.EventType.INSERT;
@@ -52,11 +54,16 @@ public String[] getReferencedColumnValues(Dialect dialect) {
5254

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

0 commit comments

Comments
 (0)