HHH-16591 Add a test case to check if PREFERRED_DURATION_JDBC_TYPE can be overridden by annotations

This commit is contained in:
marko-bekhta 2023-05-11 18:50:39 +02:00 committed by Christian Beikov
parent 3006a9fbd3
commit 86a8ef7492
1 changed files with 95 additions and 0 deletions

View File

@ -0,0 +1,95 @@
package org.hibernate.orm.test.type;
import static org.assertj.core.api.Assertions.assertThat;
import java.time.Duration;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.dialect.PostgreSQLDialect;
import org.hibernate.dialect.PostgreSQLIntervalSecondJdbcType;
import org.hibernate.metamodel.spi.MappingMetamodelImplementor;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.type.SqlTypes;
import org.hibernate.type.descriptor.jdbc.JdbcType;
import org.hibernate.type.descriptor.jdbc.NumericJdbcType;
import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeRegistry;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.RequiresDialect;
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.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
/**
* Test to see if using `@org.hibernate.annotations.JdbcTypeCode` or `@org.hibernate.annotations.JdbcType`
* will override a default JdbcType set by a {@link AvailableSettings#PREFERRED_DURATION_JDBC_TYPE config property}.
*/
@SessionFactory
@DomainModel(annotatedClasses = { PostgresIntervalSecondTest.EntityWithIntervalSecondDuration.class })
@ServiceRegistry(settings = @Setting(name = AvailableSettings.PREFERRED_DURATION_JDBC_TYPE, value = "NUMERIC"))
@RequiresDialect(PostgreSQLDialect.class)
public class PostgresIntervalSecondTest {
@Test
public void verifyMappings(SessionFactoryScope scope) {
final MappingMetamodelImplementor mappingMetamodel = scope.getSessionFactory()
.getRuntimeMetamodels()
.getMappingMetamodel();
final EntityPersister entityDescriptor = mappingMetamodel.findEntityDescriptor(
PostgresIntervalSecondTest.EntityWithIntervalSecondDuration.class );
final JdbcTypeRegistry jdbcTypeRegistry = mappingMetamodel.getTypeConfiguration().getJdbcTypeRegistry();
final JdbcType intervalType = jdbcTypeRegistry.getDescriptor( SqlTypes.INTERVAL_SECOND );
// default interval type set by a config property and should be `NUMERIC`
assertThat( intervalType ).isEqualTo( NumericJdbcType.INSTANCE );
// a simple duration field with no overrides - so should be using a default JdbcType
assertThat( entityDescriptor.findAttributeMapping( "duration" )
.getSingleJdbcMapping().getJdbcType() )
.isEqualTo( intervalType );
// a field that is using a @JdbcType annotation to override the JdbcType. Hence, the used JdbcType must match the one
// set by the annotation.
assertThat( entityDescriptor.findAttributeMapping( "durationJdbcType" )
.getSingleJdbcMapping().getJdbcType() )
.isNotEqualTo( intervalType )
.isOfAnyClassIn( PostgreSQLIntervalSecondJdbcType.class );
// a field that is using a @JdbcTypeCode annotation to override the JdbcType. Hence, the used JdbcType must match the one
// set by the annotation.
assertThat( entityDescriptor.findAttributeMapping( "durationJdbcTypeCode" )
.getSingleJdbcMapping().getJdbcType() )
.isNotEqualTo( intervalType )
.isOfAnyClassIn( PostgreSQLIntervalSecondJdbcType.class );
}
@Entity(name = "EntityWithIntervalSecondDuration")
@Table(name = "EntityWithIntervalSecondDuration")
public static class EntityWithIntervalSecondDuration {
@Id
private Integer id;
private Duration duration;
@Column(precision = 10, scale = 6)
@JdbcTypeCode(SqlTypes.INTERVAL_SECOND)
private Duration durationJdbcTypeCode;
@Column(precision = 10, scale = 6)
@org.hibernate.annotations.JdbcType(PostgreSQLIntervalSecondJdbcType.class)
private Duration durationJdbcType;
public EntityWithIntervalSecondDuration() {
}
}
}