55 */
66package org .hibernate .reactive .provider .service ;
77
8+ import org .hibernate .boot .spi .SessionFactoryOptions ;
89import org .hibernate .metamodel .mapping .EntityMappingType ;
910import org .hibernate .metamodel .mapping .internal .MappingModelCreationProcess ;
1011import 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 ;
1114import org .hibernate .query .sqm .mutation .spi .SqmMultiTableInsertStrategy ;
1215import org .hibernate .query .sqm .mutation .spi .SqmMultiTableMutationStrategy ;
1316import org .hibernate .query .sqm .mutation .spi .SqmMultiTableMutationStrategyProvider ;
@@ -21,19 +24,40 @@ public SqmMultiTableMutationStrategy createMutationStrategy(
2124 EntityMappingType rootEntityDescriptor ,
2225 MappingModelCreationProcess creationProcess ) {
2326 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+ }
2433
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 );
2741 }
2842
2943 @ Override
3044 public SqmMultiTableInsertStrategy createInsertStrategy (
3145 EntityMappingType rootEntityDescriptor ,
3246 MappingModelCreationProcess creationProcess ) {
3347 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 ;
3753 }
3854
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+ }
3963}
0 commit comments