Skip to content

Commit ff1bef3

Browse files
committed
HHH-19521 Expose different TemporaryTableStrategy from Dialect to allow configuring other mutation/insert strategies
1 parent 5dd3078 commit ff1bef3

File tree

105 files changed

+3193
-994
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+3193
-994
lines changed

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DB2LegacyDialect.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66

77
import jakarta.persistence.TemporalType;
88
import jakarta.persistence.Timeout;
9+
import org.checkerframework.checker.nullness.qual.Nullable;
910
import org.hibernate.Timeouts;
1011
import org.hibernate.boot.model.FunctionContributions;
1112
import org.hibernate.boot.model.TypeContributions;
1213
import org.hibernate.community.dialect.sequence.LegacyDB2SequenceSupport;
14+
import org.hibernate.community.dialect.temptable.DB2LegacyLocalTemporaryTableStrategy;
1315
import org.hibernate.dialect.DB2GetObjectExtractor;
1416
import org.hibernate.dialect.DatabaseVersion;
1517
import org.hibernate.dialect.Dialect;
@@ -33,6 +35,8 @@
3335
import org.hibernate.dialect.pagination.LimitHandler;
3436
import org.hibernate.dialect.sequence.DB2SequenceSupport;
3537
import org.hibernate.dialect.sequence.SequenceSupport;
38+
import org.hibernate.dialect.temptable.DB2GlobalTemporaryTableStrategy;
39+
import org.hibernate.dialect.temptable.TemporaryTableStrategy;
3640
import org.hibernate.dialect.type.DB2StructJdbcType;
3741
import org.hibernate.dialect.unique.AlterTableUniqueIndexDelegate;
3842
import org.hibernate.dialect.unique.SkipNullableUniqueDelegate;
@@ -1041,6 +1045,21 @@ public SqmMultiTableInsertStrategy getFallbackSqmInsertStrategy(
10411045
return new CteInsertStrategy( rootEntityDescriptor, runtimeModelCreationContext );
10421046
}
10431047

1048+
@Override
1049+
public @Nullable TemporaryTableStrategy getGlobalTemporaryTableStrategy() {
1050+
// Starting in DB2 9.7, "real" global temporary tables that can be shared between sessions
1051+
// are supported; (obviously) data is not shared between sessions.
1052+
return getDB2Version().isBefore( 9, 7 ) ? null : DB2GlobalTemporaryTableStrategy.INSTANCE;
1053+
}
1054+
1055+
@Override
1056+
public @Nullable TemporaryTableStrategy getLocalTemporaryTableStrategy() {
1057+
// Prior to DB2 9.7, "real" global temporary tables that can be shared between sessions
1058+
// are *not* supported; even though the DB2 command says to declare a "global" temp table
1059+
// Hibernate treats it as a "local" temp table.
1060+
return getDB2Version().isBefore( 9, 7 ) ? DB2LegacyLocalTemporaryTableStrategy.INSTANCE : null;
1061+
}
1062+
10441063
@Override
10451064
public boolean supportsCurrentTimestampSelection() {
10461065
return true;

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DerbyDialect.java

Lines changed: 16 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,9 @@
3232
import org.hibernate.dialect.lock.spi.LockingSupport;
3333
import org.hibernate.dialect.pagination.LimitHandler;
3434
import org.hibernate.dialect.sequence.SequenceSupport;
35-
import org.hibernate.dialect.temptable.TemporaryTable;
35+
import org.hibernate.community.dialect.temptable.DerbyLocalTemporaryTableStrategy;
3636
import org.hibernate.dialect.temptable.TemporaryTableKind;
37+
import org.hibernate.dialect.temptable.TemporaryTableStrategy;
3738
import org.hibernate.dialect.unique.CreateTableUniqueDelegate;
3839
import org.hibernate.dialect.unique.UniqueDelegate;
3940
import org.hibernate.engine.jdbc.Size;
@@ -52,10 +53,9 @@
5253
import org.hibernate.query.common.TemporalUnit;
5354
import org.hibernate.query.sqm.CastType;
5455
import org.hibernate.query.sqm.IntervalType;
55-
import org.hibernate.query.sqm.mutation.internal.temptable.GlobalTemporaryTableMutationStrategy;
56+
import org.hibernate.query.sqm.mutation.spi.BeforeUseAction;
5657
import org.hibernate.query.sqm.mutation.internal.temptable.LocalTemporaryTableInsertStrategy;
5758
import org.hibernate.query.sqm.mutation.internal.temptable.LocalTemporaryTableMutationStrategy;
58-
import org.hibernate.query.sqm.mutation.spi.BeforeUseAction;
5959
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
6060
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
6161
import org.hibernate.service.ServiceRegistry;
@@ -975,46 +975,18 @@ protected void registerDefaultKeywords() {
975975
registerKeyword( "YEAR" );
976976
}
977977

978-
/**
979-
* {@inheritDoc}
980-
* <p>
981-
* From Derby docs:
982-
* <pre>
983-
* The DECLARE GLOBAL TEMPORARY TABLE statement defines a temporary table for the current connection.
984-
* </pre>
985-
* <p>
986-
* {@link DB2Dialect} returns a {@link GlobalTemporaryTableMutationStrategy} that
987-
* will make temporary tables created at startup and hence unavailable for subsequent connections.<br/>
988-
* see HHH-10238.
989-
*/
990978
@Override
991979
public SqmMultiTableMutationStrategy getFallbackSqmMutationStrategy(
992980
EntityMappingType rootEntityDescriptor,
993981
RuntimeModelCreationContext runtimeModelCreationContext) {
994-
return new LocalTemporaryTableMutationStrategy(
995-
TemporaryTable.createIdTable(
996-
rootEntityDescriptor,
997-
basename -> "session." + TemporaryTable.ID_TABLE_PREFIX + basename,
998-
this,
999-
runtimeModelCreationContext
1000-
),
1001-
runtimeModelCreationContext.getSessionFactory()
1002-
);
982+
return new LocalTemporaryTableMutationStrategy( rootEntityDescriptor, runtimeModelCreationContext );
1003983
}
1004984

1005985
@Override
1006986
public SqmMultiTableInsertStrategy getFallbackSqmInsertStrategy(
1007987
EntityMappingType rootEntityDescriptor,
1008988
RuntimeModelCreationContext runtimeModelCreationContext) {
1009-
return new LocalTemporaryTableInsertStrategy(
1010-
TemporaryTable.createEntityTable(
1011-
rootEntityDescriptor,
1012-
name -> "session." + TemporaryTable.ENTITY_TABLE_PREFIX + name,
1013-
this,
1014-
runtimeModelCreationContext
1015-
),
1016-
runtimeModelCreationContext.getSessionFactory()
1017-
);
989+
return new LocalTemporaryTableInsertStrategy( rootEntityDescriptor, runtimeModelCreationContext );
1018990
}
1019991

1020992
@Override
@@ -1023,23 +995,28 @@ public TemporaryTableKind getSupportedTemporaryTableKind() {
1023995
}
1024996

1025997
@Override
1026-
public String getTemporaryTableCreateOptions() {
1027-
return "not logged";
998+
public TemporaryTableStrategy getLocalTemporaryTableStrategy() {
999+
return DerbyLocalTemporaryTableStrategy.INSTANCE;
10281000
}
10291001

10301002
@Override
1031-
public boolean supportsTemporaryTablePrimaryKey() {
1032-
return false;
1003+
public String getTemporaryTableCreateOptions() {
1004+
return DerbyLocalTemporaryTableStrategy.INSTANCE.getTemporaryTableCreateOptions();
10331005
}
10341006

10351007
@Override
10361008
public String getTemporaryTableCreateCommand() {
1037-
return "declare global temporary table";
1009+
return DerbyLocalTemporaryTableStrategy.INSTANCE.getTemporaryTableCreateCommand();
10381010
}
10391011

10401012
@Override
10411013
public BeforeUseAction getTemporaryTableBeforeUseAction() {
1042-
return BeforeUseAction.CREATE;
1014+
return DerbyLocalTemporaryTableStrategy.INSTANCE.getTemporaryTableBeforeUseAction();
1015+
}
1016+
1017+
@Override
1018+
public boolean supportsTemporaryTablePrimaryKey() {
1019+
return DerbyLocalTemporaryTableStrategy.INSTANCE.supportsTemporaryTablePrimaryKey();
10431020
}
10441021

10451022
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DerbyLegacyDialect.java

Lines changed: 16 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@
3333
import org.hibernate.dialect.pagination.AbstractLimitHandler;
3434
import org.hibernate.dialect.pagination.LimitHandler;
3535
import org.hibernate.dialect.sequence.SequenceSupport;
36-
import org.hibernate.dialect.temptable.TemporaryTable;
36+
import org.hibernate.community.dialect.temptable.DerbyLocalTemporaryTableStrategy;
3737
import org.hibernate.dialect.temptable.TemporaryTableKind;
38+
import org.hibernate.dialect.temptable.TemporaryTableStrategy;
3839
import org.hibernate.engine.jdbc.Size;
3940
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
4041
import org.hibernate.engine.jdbc.env.spi.IdentifierHelper;
@@ -51,10 +52,9 @@
5152
import org.hibernate.query.common.TemporalUnit;
5253
import org.hibernate.query.sqm.CastType;
5354
import org.hibernate.query.sqm.IntervalType;
54-
import org.hibernate.query.sqm.mutation.internal.temptable.GlobalTemporaryTableMutationStrategy;
55+
import org.hibernate.query.sqm.mutation.spi.BeforeUseAction;
5556
import org.hibernate.query.sqm.mutation.internal.temptable.LocalTemporaryTableInsertStrategy;
5657
import org.hibernate.query.sqm.mutation.internal.temptable.LocalTemporaryTableMutationStrategy;
57-
import org.hibernate.query.sqm.mutation.spi.BeforeUseAction;
5858
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
5959
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
6060
import org.hibernate.service.ServiceRegistry;
@@ -978,46 +978,18 @@ protected void registerDefaultKeywords() {
978978
registerKeyword( "YEAR" );
979979
}
980980

981-
/**
982-
* {@inheritDoc}
983-
* <p>
984-
* From Derby docs:
985-
* <pre>
986-
* The DECLARE GLOBAL TEMPORARY TABLE statement defines a temporary table for the current connection.
987-
* </pre>
988-
*
989-
* {@link DB2Dialect} returns a {@link GlobalTemporaryTableMutationStrategy} that
990-
* will make temporary tables created at startup and hence unavailable for subsequent connections.<br/>
991-
* see HHH-10238.
992-
*/
993981
@Override
994982
public SqmMultiTableMutationStrategy getFallbackSqmMutationStrategy(
995983
EntityMappingType rootEntityDescriptor,
996984
RuntimeModelCreationContext runtimeModelCreationContext) {
997-
return new LocalTemporaryTableMutationStrategy(
998-
TemporaryTable.createIdTable(
999-
rootEntityDescriptor,
1000-
basename -> "session." + TemporaryTable.ID_TABLE_PREFIX + basename,
1001-
this,
1002-
runtimeModelCreationContext
1003-
),
1004-
runtimeModelCreationContext.getSessionFactory()
1005-
);
985+
return new LocalTemporaryTableMutationStrategy( rootEntityDescriptor, runtimeModelCreationContext );
1006986
}
1007987

1008988
@Override
1009989
public SqmMultiTableInsertStrategy getFallbackSqmInsertStrategy(
1010990
EntityMappingType rootEntityDescriptor,
1011991
RuntimeModelCreationContext runtimeModelCreationContext) {
1012-
return new LocalTemporaryTableInsertStrategy(
1013-
TemporaryTable.createEntityTable(
1014-
rootEntityDescriptor,
1015-
name -> "session." + TemporaryTable.ENTITY_TABLE_PREFIX + name,
1016-
this,
1017-
runtimeModelCreationContext
1018-
),
1019-
runtimeModelCreationContext.getSessionFactory()
1020-
);
992+
return new LocalTemporaryTableInsertStrategy( rootEntityDescriptor, runtimeModelCreationContext );
1021993
}
1022994

1023995
@Override
@@ -1026,23 +998,28 @@ public TemporaryTableKind getSupportedTemporaryTableKind() {
1026998
}
1027999

10281000
@Override
1029-
public String getTemporaryTableCreateOptions() {
1030-
return "not logged";
1001+
public TemporaryTableStrategy getLocalTemporaryTableStrategy() {
1002+
return DerbyLocalTemporaryTableStrategy.INSTANCE;
10311003
}
10321004

10331005
@Override
1034-
public boolean supportsTemporaryTablePrimaryKey() {
1035-
return false;
1006+
public String getTemporaryTableCreateOptions() {
1007+
return DerbyLocalTemporaryTableStrategy.INSTANCE.getTemporaryTableCreateOptions();
10361008
}
10371009

10381010
@Override
10391011
public String getTemporaryTableCreateCommand() {
1040-
return "declare global temporary table";
1012+
return DerbyLocalTemporaryTableStrategy.INSTANCE.getTemporaryTableCreateCommand();
10411013
}
10421014

10431015
@Override
10441016
public BeforeUseAction getTemporaryTableBeforeUseAction() {
1045-
return BeforeUseAction.CREATE;
1017+
return DerbyLocalTemporaryTableStrategy.INSTANCE.getTemporaryTableBeforeUseAction();
1018+
}
1019+
1020+
@Override
1021+
public boolean supportsTemporaryTablePrimaryKey() {
1022+
return DerbyLocalTemporaryTableStrategy.INSTANCE.supportsTemporaryTablePrimaryKey();
10461023
}
10471024

10481025
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/FirebirdDialect.java

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,9 @@
4444
import org.hibernate.dialect.pagination.LimitHandler;
4545
import org.hibernate.dialect.pagination.OffsetFetchLimitHandler;
4646
import org.hibernate.dialect.sequence.SequenceSupport;
47-
import org.hibernate.dialect.temptable.TemporaryTable;
47+
import org.hibernate.dialect.temptable.StandardGlobalTemporaryTableStrategy;
4848
import org.hibernate.dialect.temptable.TemporaryTableKind;
49+
import org.hibernate.dialect.temptable.TemporaryTableStrategy;
4950
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
5051
import org.hibernate.engine.jdbc.env.spi.IdentifierHelper;
5152
import org.hibernate.engine.jdbc.env.spi.IdentifierHelperBuilder;
@@ -1023,40 +1024,29 @@ public SQLExceptionConversionDelegate buildSQLExceptionConversionDelegate() {
10231024
public SqmMultiTableMutationStrategy getFallbackSqmMutationStrategy(EntityMappingType entityDescriptor, RuntimeModelCreationContext runtimeModelCreationContext) {
10241025
return getVersion().isBefore( 2,1 )
10251026
? super.getFallbackSqmMutationStrategy( entityDescriptor, runtimeModelCreationContext )
1026-
: new GlobalTemporaryTableMutationStrategy(
1027-
TemporaryTable.createIdTable(
1028-
entityDescriptor,
1029-
name -> TemporaryTable.ID_TABLE_PREFIX + name,
1030-
this,
1031-
runtimeModelCreationContext
1032-
),
1033-
runtimeModelCreationContext.getSessionFactory()
1034-
);
1027+
: new GlobalTemporaryTableMutationStrategy( entityDescriptor, runtimeModelCreationContext );
10351028
}
10361029

10371030
@Override
10381031
public SqmMultiTableInsertStrategy getFallbackSqmInsertStrategy(EntityMappingType entityDescriptor, RuntimeModelCreationContext runtimeModelCreationContext) {
10391032
return getVersion().isBefore( 2, 1 )
10401033
? super.getFallbackSqmInsertStrategy( entityDescriptor, runtimeModelCreationContext )
1041-
: new GlobalTemporaryTableInsertStrategy(
1042-
TemporaryTable.createEntityTable(
1043-
entityDescriptor,
1044-
name -> TemporaryTable.ENTITY_TABLE_PREFIX + name,
1045-
this,
1046-
runtimeModelCreationContext
1047-
),
1048-
runtimeModelCreationContext.getSessionFactory()
1049-
);
1034+
: new GlobalTemporaryTableInsertStrategy( entityDescriptor, runtimeModelCreationContext );
10501035
}
10511036

10521037
@Override
10531038
public TemporaryTableKind getSupportedTemporaryTableKind() {
10541039
return TemporaryTableKind.GLOBAL;
10551040
}
10561041

1042+
@Override
1043+
public TemporaryTableStrategy getGlobalTemporaryTableStrategy() {
1044+
return StandardGlobalTemporaryTableStrategy.INSTANCE;
1045+
}
1046+
10571047
@Override
10581048
public String getTemporaryTableCreateOptions() {
1059-
return "on commit delete rows";
1049+
return StandardGlobalTemporaryTableStrategy.INSTANCE.getTemporaryTableCreateOptions();
10601050
}
10611051

10621052
private final FirebirdIndexExporter indexExporter = new FirebirdIndexExporter( this );

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/H2LegacyDialect.java

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@
3434
import org.hibernate.dialect.sequence.H2V1SequenceSupport;
3535
import org.hibernate.dialect.sequence.H2V2SequenceSupport;
3636
import org.hibernate.dialect.sequence.SequenceSupport;
37-
import org.hibernate.dialect.temptable.TemporaryTable;
37+
import org.hibernate.dialect.temptable.StandardLocalTemporaryTableStrategy;
3838
import org.hibernate.dialect.temptable.TemporaryTableKind;
39+
import org.hibernate.dialect.temptable.TemporaryTableStrategy;
3940
import org.hibernate.dialect.type.H2DurationIntervalSecondJdbcType;
4041
import org.hibernate.dialect.type.H2JsonArrayJdbcTypeConstructor;
4142
import org.hibernate.dialect.type.H2JsonJdbcType;
@@ -787,40 +788,29 @@ public NullOrdering getNullOrdering() {
787788
public SqmMultiTableMutationStrategy getFallbackSqmMutationStrategy(
788789
EntityMappingType entityDescriptor,
789790
RuntimeModelCreationContext runtimeModelCreationContext) {
790-
return new LocalTemporaryTableMutationStrategy(
791-
TemporaryTable.createIdTable(
792-
entityDescriptor,
793-
basename -> TemporaryTable.ID_TABLE_PREFIX + basename,
794-
this,
795-
runtimeModelCreationContext
796-
),
797-
runtimeModelCreationContext.getSessionFactory()
798-
);
791+
return new LocalTemporaryTableMutationStrategy( entityDescriptor, runtimeModelCreationContext );
799792
}
800793

801794
@Override
802795
public SqmMultiTableInsertStrategy getFallbackSqmInsertStrategy(
803796
EntityMappingType entityDescriptor,
804797
RuntimeModelCreationContext runtimeModelCreationContext) {
805-
return new LocalTemporaryTableInsertStrategy(
806-
TemporaryTable.createEntityTable(
807-
entityDescriptor,
808-
name -> TemporaryTable.ENTITY_TABLE_PREFIX + name,
809-
this,
810-
runtimeModelCreationContext
811-
),
812-
runtimeModelCreationContext.getSessionFactory()
813-
);
798+
return new LocalTemporaryTableInsertStrategy( entityDescriptor, runtimeModelCreationContext );
814799
}
815800

816801
@Override
817802
public TemporaryTableKind getSupportedTemporaryTableKind() {
818803
return TemporaryTableKind.LOCAL;
819804
}
820805

806+
@Override
807+
public TemporaryTableStrategy getLocalTemporaryTableStrategy() {
808+
return StandardLocalTemporaryTableStrategy.INSTANCE;
809+
}
810+
821811
@Override
822812
public BeforeUseAction getTemporaryTableBeforeUseAction() {
823-
return BeforeUseAction.CREATE;
813+
return StandardLocalTemporaryTableStrategy.INSTANCE.getTemporaryTableBeforeUseAction();
824814
}
825815

826816
@Override

0 commit comments

Comments
 (0)