5
5
*/
6
6
package org .hibernate .reactive .provider .service ;
7
7
8
+ import org .hibernate .boot .spi .SessionFactoryOptions ;
8
9
import org .hibernate .metamodel .mapping .EntityMappingType ;
9
10
import org .hibernate .metamodel .mapping .internal .MappingModelCreationProcess ;
10
11
import org .hibernate .metamodel .spi .RuntimeModelCreationContext ;
12
+ import org .hibernate .query .sqm .mutation .internal .cte .CteInsertStrategy ;
13
+ import org .hibernate .query .sqm .mutation .internal .cte .CteMutationStrategy ;
11
14
import org .hibernate .query .sqm .mutation .spi .SqmMultiTableInsertStrategy ;
12
15
import org .hibernate .query .sqm .mutation .spi .SqmMultiTableMutationStrategy ;
13
16
import org .hibernate .query .sqm .mutation .spi .SqmMultiTableMutationStrategyProvider ;
@@ -21,19 +24,40 @@ public SqmMultiTableMutationStrategy createMutationStrategy(
21
24
EntityMappingType rootEntityDescriptor ,
22
25
MappingModelCreationProcess creationProcess ) {
23
26
final RuntimeModelCreationContext creationContext = creationProcess .getCreationContext ();
27
+ SqmMultiTableMutationStrategy mutationStrategy = mutationStrategy ( rootEntityDescriptor , creationContext );
28
+ if ( mutationStrategy instanceof CteMutationStrategy ) {
29
+ return new ReactiveCteMutationStrategy ( rootEntityDescriptor , creationContext );
30
+ }
31
+ return mutationStrategy ;
32
+ }
24
33
25
- //TODO there's more flavours in ORM ? And what do we do about explicitly configured instances & Dialect produced implementations?
26
- return new ReactiveCteMutationStrategy ( rootEntityDescriptor , creationContext );
34
+ private static SqmMultiTableMutationStrategy mutationStrategy (
35
+ EntityMappingType rootEntityDescriptor ,
36
+ RuntimeModelCreationContext creationContext ) {
37
+ final SessionFactoryOptions options = creationContext .getSessionFactoryOptions ();
38
+ return options .getCustomSqmMultiTableMutationStrategy () != null
39
+ ? options .getCustomSqmMultiTableMutationStrategy ()
40
+ : creationContext .getDialect ().getFallbackSqmMutationStrategy ( rootEntityDescriptor , creationContext );
27
41
}
28
42
29
43
@ Override
30
44
public SqmMultiTableInsertStrategy createInsertStrategy (
31
45
EntityMappingType rootEntityDescriptor ,
32
46
MappingModelCreationProcess creationProcess ) {
33
47
final RuntimeModelCreationContext creationContext = creationProcess .getCreationContext ();
34
-
35
- //TODO there's more flavours in ORM ? And what do we do about explicitly configured instances & Dialect produced implementations?
36
- return new ReactiveCteInsertStrategy ( rootEntityDescriptor , creationContext );
48
+ final SqmMultiTableInsertStrategy insertStrategy = insertStrategy ( rootEntityDescriptor , creationContext );
49
+ if ( insertStrategy instanceof CteInsertStrategy ) {
50
+ return new ReactiveCteInsertStrategy ( rootEntityDescriptor , creationContext );
51
+ }
52
+ return insertStrategy ;
37
53
}
38
54
55
+ private static SqmMultiTableInsertStrategy insertStrategy (
56
+ EntityMappingType rootEntityDescriptor ,
57
+ RuntimeModelCreationContext creationContext ) {
58
+ final SessionFactoryOptions options = creationContext .getSessionFactoryOptions ();
59
+ return options .getCustomSqmMultiTableInsertStrategy () != null
60
+ ? options .getCustomSqmMultiTableInsertStrategy ()
61
+ : creationContext .getDialect ().getFallbackSqmInsertStrategy ( rootEntityDescriptor , creationContext );
62
+ }
39
63
}
0 commit comments