8
8
import java .sql .ResultSet ;
9
9
import java .sql .SQLException ;
10
10
import java .util .ArrayList ;
11
- import java .util .Collections ;
12
11
import java .util .List ;
13
12
14
13
import org .hibernate .HibernateException ;
30
29
import org .hibernate .metamodel .mapping .ModelPart ;
31
30
import org .hibernate .metamodel .mapping .SelectableMapping ;
32
31
import org .hibernate .persister .entity .EntityPersister ;
33
- import org .hibernate .persister .entity .mutation .EntityTableMapping ;
34
32
import org .hibernate .query .results .internal .TableGroupImpl ;
35
33
import org .hibernate .query .spi .QueryOptions ;
36
34
import org .hibernate .spi .NavigablePath ;
37
35
import org .hibernate .sql .ast .tree .from .NamedTableReference ;
38
36
import org .hibernate .sql .ast .tree .from .TableGroup ;
39
37
import org .hibernate .sql .exec .internal .BaseExecutionContext ;
40
- import org .hibernate .sql .exec .spi .ExecutionContext ;
41
- import org .hibernate .sql .model .MutationType ;
42
38
import org .hibernate .sql .model .TableMapping ;
43
39
import org .hibernate .sql .results .internal .ResultsHelper ;
44
40
import org .hibernate .sql .results .internal .RowProcessingStateStandardImpl ;
48
44
import org .hibernate .sql .results .jdbc .internal .JdbcValuesSourceProcessingStateStandardImpl ;
49
45
import org .hibernate .sql .results .jdbc .spi .JdbcValues ;
50
46
import org .hibernate .sql .results .jdbc .spi .JdbcValuesMappingProducer ;
51
- import org .hibernate .sql .results .jdbc .spi .JdbcValuesSourceProcessingOptions ;
52
47
import org .hibernate .sql .results .spi .ListResultsConsumer ;
53
48
import org .hibernate .sql .results .spi .RowReader ;
54
49
50
+ import static java .util .Collections .unmodifiableList ;
55
51
import static org .hibernate .internal .NaturalIdHelper .getNaturalIdPropertyNames ;
56
52
import static org .hibernate .pretty .MessageHelper .infoString ;
53
+ import static org .hibernate .sql .model .MutationType .INSERT ;
54
+ import static org .hibernate .sql .model .MutationType .UPDATE ;
55
+ import static org .hibernate .sql .results .jdbc .spi .JdbcValuesSourceProcessingOptions .NO_OPTIONS ;
57
56
58
57
/**
59
58
* Factory and helper methods for {@link GeneratedValuesMutationDelegate} framework.
@@ -65,7 +64,7 @@ public class GeneratedValuesHelper {
65
64
private static final CoreMessageLogger LOG = CoreLogging .messageLogger ( IdentifierGeneratorHelper .class );
66
65
67
66
/**
68
- * Reads the {@link EntityPersister#getGeneratedProperties(EventType) generated values}
67
+ * Reads the {@linkplain EntityPersister#getGeneratedProperties(EventType) generated values}
69
68
* for the specified {@link ResultSet}.
70
69
*
71
70
* @param resultSet The result set from which to extract the generated values
@@ -87,19 +86,18 @@ public static GeneratedValues getGeneratedValues(
87
86
return null ;
88
87
}
89
88
90
- final GeneratedValuesMutationDelegate delegate = persister .getMutationDelegate (
91
- timing == EventType .INSERT ? MutationType .INSERT : MutationType .UPDATE
92
- );
93
- final GeneratedValuesMappingProducer mappingProducer =
94
- (GeneratedValuesMappingProducer ) delegate .getGeneratedValuesMappingProducer ();
95
- final List <GeneratedValueBasicResultBuilder > resultBuilders = mappingProducer .getResultBuilders ();
89
+ final var mappingProducer =
90
+ (GeneratedValuesMappingProducer )
91
+ persister .getMutationDelegate ( timing == EventType .INSERT ? INSERT : UPDATE )
92
+ .getGeneratedValuesMappingProducer ();
93
+ final var resultBuilders = mappingProducer .getResultBuilders ();
96
94
final List <ModelPart > generatedProperties = new ArrayList <>( resultBuilders .size () );
97
- for ( GeneratedValueBasicResultBuilder resultBuilder : resultBuilders ) {
95
+ for ( var resultBuilder : resultBuilders ) {
98
96
generatedProperties .add ( resultBuilder .getModelPart () );
99
97
}
100
98
101
- final GeneratedValuesImpl generatedValues = new GeneratedValuesImpl ( generatedProperties );
102
- final Object [] results = readGeneratedValues ( resultSet , statement , persister , mappingProducer , session );
99
+ final var generatedValues = new GeneratedValuesImpl ( generatedProperties );
100
+ final var results = readGeneratedValues ( resultSet , statement , persister , mappingProducer , session );
103
101
104
102
if ( LOG .isDebugEnabled () ) {
105
103
LOG .debug ( "Extracted generated values for entity "
@@ -130,84 +128,38 @@ private static Object[] readGeneratedValues(
130
128
EntityPersister persister ,
131
129
JdbcValuesMappingProducer mappingProducer ,
132
130
SharedSessionContractImplementor session ) {
133
- final ExecutionContext executionContext = new BaseExecutionContext ( session );
134
-
135
- final DirectResultSetAccess directResultSetAccess = new DirectResultSetAccess (
136
- session ,
137
- statement ,
138
- resultSet
139
- );
140
-
131
+ final var factory = session .getFactory ();
132
+ final var executionContext = new BaseExecutionContext ( session );
133
+ final var directResultSetAccess =
134
+ new DirectResultSetAccess ( session , statement , resultSet );
135
+ final var influencers = session .getLoadQueryInfluencers ();
141
136
final JdbcValues jdbcValues = new JdbcValuesResultSetImpl (
142
137
directResultSetAccess ,
143
138
null ,
144
139
null ,
145
140
QueryOptions .NONE ,
146
141
true ,
147
- mappingProducer .resolve (
148
- directResultSetAccess ,
149
- session .getLoadQueryInfluencers (),
150
- session .getSessionFactory ()
151
- ),
142
+ mappingProducer .resolve ( directResultSetAccess , influencers , factory ),
152
143
null ,
153
144
executionContext
154
145
);
155
-
156
- final JdbcValuesSourceProcessingOptions processingOptions = new JdbcValuesSourceProcessingOptions () {
157
- @ Override
158
- public Object getEffectiveOptionalObject () {
159
- return null ;
160
- }
161
-
162
- @ Override
163
- public String getEffectiveOptionalEntityName () {
164
- return null ;
165
- }
166
-
167
- @ Override
168
- public Object getEffectiveOptionalId () {
169
- return null ;
170
- }
171
-
172
- @ Override
173
- public boolean shouldReturnProxies () {
174
- return true ;
175
- }
176
- };
177
-
178
- final JdbcValuesSourceProcessingStateStandardImpl valuesProcessingState =
179
- new JdbcValuesSourceProcessingStateStandardImpl ( executionContext , processingOptions );
180
-
146
+ final var valuesProcessingState =
147
+ new JdbcValuesSourceProcessingStateStandardImpl ( executionContext , NO_OPTIONS );
181
148
final RowReader <Object []> rowReader = ResultsHelper .createRowReader (
182
- session . getFactory () ,
149
+ factory ,
183
150
RowTransformerArrayImpl .instance (),
184
151
Object [].class ,
185
152
jdbcValues
186
153
);
187
-
188
- final RowProcessingStateStandardImpl rowProcessingState = new RowProcessingStateStandardImpl (
189
- valuesProcessingState ,
190
- executionContext ,
191
- rowReader ,
192
- jdbcValues
193
- );
194
-
195
- final List <Object []> results = ListResultsConsumer .<Object []>instance ( ListResultsConsumer .UniqueSemantic .NONE )
196
- .consume (
197
- jdbcValues ,
198
- session ,
199
- processingOptions ,
200
- valuesProcessingState ,
201
- rowProcessingState ,
202
- rowReader
203
- );
204
-
154
+ final var rowProcessingState =
155
+ new RowProcessingStateStandardImpl ( valuesProcessingState , executionContext , rowReader , jdbcValues );
156
+ final List <Object []> results =
157
+ ListResultsConsumer .<Object []>instance ( ListResultsConsumer .UniqueSemantic .NONE )
158
+ .consume ( jdbcValues , session , NO_OPTIONS , valuesProcessingState , rowProcessingState , rowReader );
205
159
if ( results .isEmpty () ) {
206
- throw new HibernateException (
207
- "The database returned no natively generated values : " + persister .getNavigableRole ().getFullPath ()
208
- );
160
+ throw new HibernateException ( "The database returned no natively generated values : "
161
+ + persister .getNavigableRole ().getFullPath () );
209
162
}
210
-
211
163
return results .get ( 0 );
212
164
}
213
165
@@ -228,33 +180,34 @@ public static GeneratedValuesMappingProducer createMappingProducer(
228
180
EventType timing ,
229
181
boolean supportsArbitraryValues ,
230
182
boolean supportsRowId ) {
231
- // This is just a mock table group needed to correctly resolve expressions
183
+ return generatedValuesMappingProducer ( persister , supportsArbitraryValues ,
184
+ getActualGeneratedModelParts ( persister , timing , supportsArbitraryValues , supportsRowId ) );
185
+ }
186
+
187
+ private static GeneratedValuesMappingProducer generatedValuesMappingProducer (
188
+ EntityPersister persister ,
189
+ boolean supportsArbitraryValues ,
190
+ List <? extends ModelPart > generatedProperties ) {
232
191
final NavigablePath parentNavigablePath = new NavigablePath ( persister .getEntityName () );
192
+ // This is just a mock table group needed to correctly resolve expressions
233
193
final TableGroup tableGroup = new TableGroupImpl (
234
194
parentNavigablePath ,
235
195
null ,
236
196
new NamedTableReference ( "t" , "t" ),
237
197
persister
238
198
);
239
199
// Create the mapping producer and add all result builders to it
240
- final List <? extends ModelPart > generatedProperties = getActualGeneratedModelParts (
241
- persister ,
242
- timing ,
243
- supportsArbitraryValues ,
244
- supportsRowId
245
- );
246
- final GeneratedValuesMappingProducer mappingProducer = new GeneratedValuesMappingProducer ();
200
+ final var mappingProducer = new GeneratedValuesMappingProducer ();
247
201
for ( int i = 0 ; i < generatedProperties .size (); i ++ ) {
248
- final ModelPart modelPart = generatedProperties .get ( i );
249
- final BasicValuedModelPart basicModelPart = modelPart .asBasicValuedModelPart ();
202
+ final var modelPart = generatedProperties .get ( i );
203
+ final var basicModelPart = modelPart .asBasicValuedModelPart ();
250
204
if ( basicModelPart != null ) {
251
- final GeneratedValueBasicResultBuilder resultBuilder = new GeneratedValueBasicResultBuilder (
205
+ mappingProducer . addResultBuilder ( new GeneratedValueBasicResultBuilder (
252
206
parentNavigablePath .append ( basicModelPart .getSelectableName () ),
253
207
basicModelPart ,
254
208
tableGroup ,
255
209
supportsArbitraryValues ? i : null
256
- );
257
- mappingProducer .addResultBuilder ( resultBuilder );
210
+ ) );
258
211
}
259
212
else {
260
213
throw new UnsupportedOperationException ( "Unsupported generated ModelPart: " + modelPart .getPartName () );
@@ -266,12 +219,12 @@ public static GeneratedValuesMappingProducer createMappingProducer(
266
219
public static BasicValuedModelPart getActualGeneratedModelPart (BasicValuedModelPart modelPart ) {
267
220
// Use the root entity descriptor's identifier mapping to get the correct selection
268
221
// expression since we always retrieve generated values for the root table only
269
- return modelPart .isEntityIdentifierMapping () ?
270
- modelPart .findContainingEntityMapping ()
222
+ return modelPart .isEntityIdentifierMapping ()
223
+ ? modelPart .findContainingEntityMapping ()
271
224
.getRootEntityDescriptor ()
272
225
.getIdentifierMapping ()
273
- .asBasicValuedModelPart () :
274
- modelPart ;
226
+ .asBasicValuedModelPart ()
227
+ : modelPart ;
275
228
}
276
229
277
230
/**
@@ -284,14 +237,16 @@ private static List<? extends ModelPart> getActualGeneratedModelParts(
284
237
boolean supportsArbitraryValues ,
285
238
boolean supportsRowId ) {
286
239
if ( timing == EventType .INSERT ) {
287
- final List <? extends ModelPart > generatedProperties = supportsArbitraryValues ?
288
- persister .getInsertGeneratedProperties () :
289
- List .of ( persister .getIdentifierMapping () );
240
+ final var generatedProperties =
241
+ supportsArbitraryValues
242
+ ? persister .getInsertGeneratedProperties ()
243
+ : List .of ( persister .getIdentifierMapping () );
290
244
if ( persister .getRowIdMapping () != null && supportsRowId ) {
291
- final List <ModelPart > newList = new ArrayList <>( generatedProperties .size () + 1 );
245
+ final List <ModelPart > newList =
246
+ new ArrayList <>( generatedProperties .size () + 1 );
292
247
newList .addAll ( generatedProperties );
293
248
newList .add ( persister .getRowIdMapping () );
294
- return Collections . unmodifiableList ( newList );
249
+ return unmodifiableList ( newList );
295
250
}
296
251
else {
297
252
return generatedProperties ;
@@ -313,53 +268,55 @@ private static List<? extends ModelPart> getActualGeneratedModelParts(
313
268
public static GeneratedValuesMutationDelegate getGeneratedValuesDelegate (
314
269
EntityPersister persister ,
315
270
EventType timing ) {
316
- final List <? extends ModelPart > generatedProperties = persister .getGeneratedProperties ( timing );
317
- final boolean hasGeneratedProperties = ! generatedProperties . isEmpty ( );
271
+ final var factory = persister .getFactory ( );
272
+ final var generatedProperties = persister . getGeneratedProperties ( timing );
318
273
final boolean hasFormula =
319
274
generatedProperties .stream ()
320
- .anyMatch ( part -> part instanceof SelectableMapping selectable && selectable .isFormula () );
321
- final boolean hasRowId = timing == EventType .INSERT && persister .getRowIdMapping () != null ;
322
- final Dialect dialect = persister .getFactory ().getJdbcServices ().getDialect ();
323
-
324
- if ( hasRowId && dialect .supportsInsertReturning () && dialect .supportsInsertReturningRowId ()
275
+ .anyMatch ( part -> part instanceof SelectableMapping selectable
276
+ && selectable .isFormula () );
277
+ final boolean hasRowId =
278
+ timing == EventType .INSERT
279
+ && persister .getRowIdMapping () != null ;
280
+ final Dialect dialect = factory .getJdbcServices ().getDialect ();
281
+ if ( hasRowId
282
+ && dialect .supportsInsertReturning ()
283
+ && dialect .supportsInsertReturningRowId ()
325
284
&& noCustomSql ( persister , timing ) ) {
326
285
// Special case for RowId on INSERT, since GetGeneratedKeysDelegate doesn't support it
327
286
// make InsertReturningDelegate the preferred method if the dialect supports it
328
287
return new InsertReturningDelegate ( persister , timing );
329
288
}
330
-
331
- if ( !hasGeneratedProperties ) {
289
+ else if ( generatedProperties .isEmpty () ) {
332
290
return null ;
333
291
}
334
-
335
- if ( !hasFormula
292
+ else if ( !hasFormula
336
293
&& dialect .supportsInsertReturningGeneratedKeys ()
337
- && persister . getFactory () .getSessionFactoryOptions ().isGetGeneratedKeysEnabled () ) {
294
+ && factory .getSessionFactoryOptions ().isGetGeneratedKeysEnabled () ) {
338
295
return new GetGeneratedKeysDelegate ( persister , false , timing );
339
296
}
340
297
else if ( supportsReturning ( dialect , timing ) && noCustomSql ( persister , timing ) ) {
341
298
return new InsertReturningDelegate ( persister , timing );
342
299
}
343
- else if ( timing == EventType .INSERT && persister .getNaturalIdentifierProperties () != null
344
- && !persister .getEntityMetamodel ().isNaturalIdentifierInsertGenerated () ) {
345
- return new UniqueKeySelectingDelegate (
346
- persister ,
347
- getNaturalIdPropertyNames ( persister ),
348
- timing
349
- );
300
+ else if ( timing == EventType .INSERT
301
+ && persister .getNaturalIdentifierProperties () != null
302
+ && !persister .getEntityMetamodel ().isNaturalIdentifierInsertGenerated () ) {
303
+ return new UniqueKeySelectingDelegate ( persister , getNaturalIdPropertyNames ( persister ), timing );
350
304
}
351
305
return null ;
352
306
}
353
307
354
308
private static boolean supportsReturning (Dialect dialect , EventType timing ) {
355
- return timing == EventType .INSERT ? dialect .supportsInsertReturning () : dialect .supportsUpdateReturning ();
309
+ return timing == EventType .INSERT
310
+ ? dialect .supportsInsertReturning ()
311
+ : dialect .supportsUpdateReturning ();
356
312
}
357
313
358
314
public static boolean noCustomSql (EntityPersister persister , EventType timing ) {
359
- final EntityTableMapping identifierTable = persister .getIdentifierTableMapping ();
360
- final TableMapping .MutationDetails mutationDetails = timing == EventType .INSERT ?
361
- identifierTable .getInsertDetails () :
362
- identifierTable .getUpdateDetails ();
315
+ final var identifierTable = persister .getIdentifierTableMapping ();
316
+ final TableMapping .MutationDetails mutationDetails =
317
+ timing == EventType .INSERT
318
+ ? identifierTable .getInsertDetails ()
319
+ : identifierTable .getUpdateDetails ();
363
320
return mutationDetails .getCustomSql () == null ;
364
321
}
365
322
}
0 commit comments