|
6 | 6 | */ |
7 | 7 | package org.hibernate.id; |
8 | 8 |
|
| 9 | +import java.util.List; |
| 10 | + |
9 | 11 | import org.hibernate.boot.spi.SessionFactoryOptions; |
10 | 12 | import org.hibernate.dialect.Dialect; |
11 | | -import org.hibernate.engine.spi.SessionFactoryImplementor; |
12 | 13 | import org.hibernate.generator.OnExecutionGenerator; |
13 | 14 | import org.hibernate.id.factory.spi.StandardGenerator; |
14 | 15 | import org.hibernate.id.insert.BasicSelectingDelegate; |
15 | 16 | import org.hibernate.id.insert.GetGeneratedKeysDelegate; |
16 | 17 | import org.hibernate.id.insert.InsertGeneratedIdentifierDelegate; |
17 | 18 | import org.hibernate.id.insert.InsertReturningDelegate; |
18 | 19 | import org.hibernate.id.insert.UniqueKeySelectingDelegate; |
| 20 | +import org.hibernate.metamodel.mapping.ModelPart; |
19 | 21 |
|
20 | 22 | import static org.hibernate.generator.EventType.INSERT; |
21 | 23 | import static org.hibernate.generator.internal.NaturalIdHelper.getNaturalIdPropertyNames; |
@@ -54,11 +56,16 @@ public String[] getReferencedColumnValues(Dialect dialect) { |
54 | 56 |
|
55 | 57 | @Override |
56 | 58 | 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 | + } |
59 | 67 | // 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() ) { |
62 | 69 | return new GetGeneratedKeysDelegate( persister, false, INSERT ); |
63 | 70 | } |
64 | 71 | else if ( dialect.supportsInsertReturning() && noCustomSql( persister, INSERT ) ) { |
|
0 commit comments