diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/LocalTemporaryTableMutationStrategyNoDropTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/LocalTemporaryTableMutationStrategyNoDropTest.java new file mode 100644 index 0000000000..afcd369b64 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/LocalTemporaryTableMutationStrategyNoDropTest.java @@ -0,0 +1,203 @@ +package org.hibernate.orm.test; + +import java.util.Map; + +import org.hibernate.boot.model.relational.SqlStringGenerationContext; +import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; +import org.hibernate.boot.spi.BootstrapContext; +import org.hibernate.boot.spi.MetadataImplementor; +import org.hibernate.boot.spi.SessionFactoryOptions; +import org.hibernate.cache.spi.CacheImplementor; +import org.hibernate.dialect.Dialect; +import org.hibernate.dialect.temptable.StandardTemporaryTableExporter; +import org.hibernate.dialect.temptable.TemporaryTable; +import org.hibernate.dialect.temptable.TemporaryTableKind; +import org.hibernate.engine.jdbc.spi.JdbcServices; +import org.hibernate.engine.spi.SessionFactoryImplementor; +import org.hibernate.engine.spi.SessionImplementor; +import org.hibernate.metamodel.spi.MappingMetamodelImplementor; +import org.hibernate.metamodel.spi.RuntimeModelCreationContext; +import org.hibernate.query.sqm.function.SqmFunctionRegistry; +import org.hibernate.query.sqm.mutation.internal.temptable.LocalTemporaryTableMutationStrategy; +import org.hibernate.sql.ast.spi.ParameterMarkerStrategy; +import org.hibernate.type.descriptor.jdbc.JdbcType; + +import org.hibernate.testing.orm.junit.DomainModel; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.ServiceRegistry; +import org.hibernate.testing.orm.junit.SessionFactory; +import org.hibernate.testing.orm.junit.SessionFactoryScope; +import org.hibernate.testing.orm.junit.Setting; +import org.junit.jupiter.api.Test; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Inheritance; +import jakarta.persistence.InheritanceType; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +@DomainModel( + annotatedClasses = { + LocalTemporaryTableMutationStrategyNoDropTest.TestEntity.class + } +) +@SessionFactory +@ServiceRegistry( + settings = { + @Setting(name = LocalTemporaryTableMutationStrategy.DROP_ID_TABLES, value = "false") + }, + services = @ServiceRegistry.Service( + role = ParameterMarkerStrategy.class, + impl = LocalTemporaryTableMutationStrategyNoDropTest.ParameterMarkerStrategyImpl.class + ) +) +@JiraKey("HHH-16486") +public class LocalTemporaryTableMutationStrategyNoDropTest { + + private static final String MARKER = "$n"; + + @Test + public void testGetSqlTruncateCommand(SessionFactoryScope scope) { + scope.inTransaction( + session -> { + StandardTemporaryTableExporter standardTemporaryTableExporter + = createStandardTemporaryTableExporter( session ); + TemporaryTable idTable = createTemporaryTable( scope, session ); + String sqlTruncateCommand = standardTemporaryTableExporter.getSqlTruncateCommand( + idTable, + null, + session + ); + assertThat( sqlTruncateCommand ) + .contains( idTable.getSessionUidColumn().getColumnName() + " = " + MARKER ); + } + ); + + } + + private static StandardTemporaryTableExporter createStandardTemporaryTableExporter(SessionImplementor session) { + return new StandardTemporaryTableExporter( getDialect() ); + } + + private static Dialect getDialect() { + return new TestDialect(); + } + + private static TemporaryTable createTemporaryTable( + SessionFactoryScope scope, + SessionImplementor session) { + SessionFactoryImplementor sessionFactory = scope.getSessionFactory(); + JdbcServices jdbcServices = sessionFactory.getJdbcServices(); + Dialect dialect = getDialect(); + return TemporaryTable.createIdTable( + session.getEntityPersister( null, new TestEntity() ), + basename -> TemporaryTable.ID_TABLE_PREFIX + basename, + dialect, + new RuntimeModelCreationContext() { + + @Override + public SessionFactoryImplementor getSessionFactory() { + return sessionFactory; + } + + @Override + public BootstrapContext getBootstrapContext() { + return null; + } + + @Override + public MetadataImplementor getBootModel() { + return scope.getMetadataImplementor(); + } + + @Override + public MappingMetamodelImplementor getDomainModel() { + return null; + } + + @Override + public SqmFunctionRegistry getFunctionRegistry() { + return null; + } + + @Override + public Map getSettings() { + return sessionFactory.getProperties(); + } + + @Override + public Dialect getDialect() { + return dialect; + } + + @Override + public CacheImplementor getCache() { + return null; + } + + @Override + public SessionFactoryOptions getSessionFactoryOptions() { + return sessionFactory.getSessionFactoryOptions(); + } + + @Override + public JdbcServices getJdbcServices() { + return jdbcServices; + } + + @Override + public SqlStringGenerationContext getSqlStringGenerationContext() { + return SqlStringGenerationContextImpl.fromExplicit( + jdbcServices.getJdbcEnvironment(), + scope.getMetadataImplementor().getDatabase(), + null, + null + ); + } + + @Override + public org.hibernate.service.ServiceRegistry getServiceRegistry() { + return sessionFactory.getServiceRegistry(); + } + } + ); + } + + public static class ParameterMarkerStrategyImpl implements ParameterMarkerStrategy { + @Override + public String createMarker(int position, JdbcType jdbcType) { + return MARKER; + } + } + + public static class TestDialect extends Dialect { + + @Override + public boolean supportsTemporaryTables() { + return true; + } + + @Override + public TemporaryTableKind getSupportedTemporaryTableKind() { + return TemporaryTableKind.PERSISTENT; + } + } + + + @Entity(name = "ParentEntity") + @Inheritance(strategy = InheritanceType.JOINED) + public static class ParentEntity { + @Id + @GeneratedValue + public Long id; + String name; + } + + @Entity(name = "TestEntity") + public static class TestEntity extends ParentEntity { + + + } +}