Skip to content

Commit 92ba67a

Browse files
committed
Fix for PostgreSQL ReactiveSqmMultiTableMutationStrategyProvider
1 parent c3f1614 commit 92ba67a

File tree

2 files changed

+29
-27
lines changed

2 files changed

+29
-27
lines changed

hibernate-reactive-core/src/main/java/org/hibernate/reactive/dialect/ReactiveDialectWrapper.java

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,6 @@
88
import org.hibernate.dialect.Dialect;
99
import org.hibernate.dialect.DialectDelegateWrapper;
1010
import org.hibernate.dialect.identity.IdentityColumnSupport;
11-
import org.hibernate.metamodel.mapping.EntityMappingType;
12-
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
13-
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
14-
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
1511
import org.hibernate.reactive.dialect.identity.ReactiveIdentityColumnSupportAdapter;
1612

1713
/**
@@ -29,22 +25,4 @@ public ReactiveDialectWrapper(Dialect wrapped) {
2925
public IdentityColumnSupport getIdentityColumnSupport() {
3026
return new ReactiveIdentityColumnSupportAdapter( super.getIdentityColumnSupport() );
3127
}
32-
33-
@Override
34-
public SqmMultiTableMutationStrategy getFallbackSqmMutationStrategy(
35-
EntityMappingType rootEntityDescriptor,
36-
RuntimeModelCreationContext runtimeModelCreationContext) {
37-
throw new IllegalStateException(
38-
"Should never be called - see ReactiveSqmMultiTableMutationStrategyProvider" );
39-
}
40-
41-
@Override
42-
public SqmMultiTableInsertStrategy getFallbackSqmInsertStrategy(
43-
EntityMappingType rootEntityDescriptor,
44-
RuntimeModelCreationContext runtimeModelCreationContext) {
45-
throw new IllegalStateException(
46-
"Should never be called - see ReactiveSqmMultiTableMutationStrategyProvider" );
47-
48-
}
49-
5028
}

hibernate-reactive-core/src/main/java/org/hibernate/reactive/provider/service/ReactiveSqmMultiTableMutationStrategyProvider.java

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55
*/
66
package org.hibernate.reactive.provider.service;
77

8+
import org.hibernate.boot.spi.SessionFactoryOptions;
89
import org.hibernate.metamodel.mapping.EntityMappingType;
910
import org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess;
1011
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;
1114
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
1215
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
1316
import 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

Comments
 (0)