diff --git a/hibernate-core/src/main/java/org/hibernate/annotations/Source.java b/hibernate-core/src/main/java/org/hibernate/annotations/Source.java index d6dbf7e017a9..ea1d367ea704 100644 --- a/hibernate-core/src/main/java/org/hibernate/annotations/Source.java +++ b/hibernate-core/src/main/java/org/hibernate/annotations/Source.java @@ -47,8 +47,9 @@ @ValueGenerationType(generatedBy = SourceGeneration.class) public @interface Source { /** - * The source of timestamps. By default, the {@linkplain - * SourceType#VM virtual machine} is the source. + * The source of timestamps. By default, the + * {@linkplain SourceType#VM virtual machine} + * is the source. */ SourceType value() default SourceType.VM; } diff --git a/hibernate-core/src/main/java/org/hibernate/generator/OnExecutionGenerator.java b/hibernate-core/src/main/java/org/hibernate/generator/OnExecutionGenerator.java index 12bddc28f3d8..3ae21e03e1cc 100644 --- a/hibernate-core/src/main/java/org/hibernate/generator/OnExecutionGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/generator/OnExecutionGenerator.java @@ -6,7 +6,6 @@ import org.hibernate.Incubating; import org.hibernate.dialect.Dialect; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.id.insert.GetGeneratedKeysDelegate; import org.hibernate.id.insert.InsertGeneratedIdentifierDelegate; import org.hibernate.id.insert.InsertReturningDelegate; @@ -116,8 +115,8 @@ public interface OnExecutionGenerator extends Generator { */ @Incubating default InsertGeneratedIdentifierDelegate getGeneratedIdentifierDelegate(EntityPersister persister) { - final SessionFactoryImplementor factory = persister.getFactory(); - final Dialect dialect = factory.getJdbcServices().getDialect(); + final var factory = persister.getFactory(); + final var dialect = factory.getJdbcServices().getDialect(); if ( dialect.supportsInsertReturningGeneratedKeys() && factory.getSessionFactoryOptions().isGetGeneratedKeysEnabled() ) { return new GetGeneratedKeysDelegate( persister, false, INSERT ); diff --git a/hibernate-core/src/main/java/org/hibernate/generator/internal/CurrentTimestampGeneration.java b/hibernate-core/src/main/java/org/hibernate/generator/internal/CurrentTimestampGeneration.java index 31e23c1e9c48..4702f1329cbe 100644 --- a/hibernate-core/src/main/java/org/hibernate/generator/internal/CurrentTimestampGeneration.java +++ b/hibernate-core/src/main/java/org/hibernate/generator/internal/CurrentTimestampGeneration.java @@ -7,9 +7,7 @@ import java.lang.reflect.Member; import java.sql.CallableStatement; import java.sql.PreparedStatement; -import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Time; import java.sql.Timestamp; import java.time.Clock; import java.time.Instant; @@ -25,10 +23,7 @@ import java.util.Calendar; import java.util.Date; import java.util.EnumSet; -import java.util.HashMap; -import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.function.BiFunction; import org.hibernate.SessionFactory; import org.hibernate.annotations.CreationTimestamp; @@ -39,7 +34,6 @@ import org.hibernate.engine.config.spi.ConfigurationService; import org.hibernate.engine.jdbc.Size; import org.hibernate.engine.jdbc.spi.JdbcCoordinator; -import org.hibernate.engine.jdbc.spi.StatementPreparer; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.generator.BeforeExecutionGenerator; import org.hibernate.generator.EventType; @@ -88,108 +82,9 @@ public class CurrentTimestampGeneration implements BeforeExecutionGenerator, OnE private final EnumSet eventTypes; private final JavaType propertyType; - private final CurrentTimestampGeneratorDelegate delegate; + private final GeneratorDelegate delegate; - private static final Map, BiFunction<@Nullable Clock, Integer, CurrentTimestampGeneratorDelegate>> GENERATOR_PRODUCERS = new HashMap<>(); - private static final Map GENERATOR_DELEGATES = new ConcurrentHashMap<>(); - - static { - GENERATOR_PRODUCERS.put( - Date.class, - (baseClock, precision) -> { - final Clock clock = ClockHelper.forPrecision( baseClock, precision, 3 ); - return () -> new Date( clock.millis() ); - } - ); - GENERATOR_PRODUCERS.put( - Calendar.class, - (baseClock, precision) -> { - final Clock clock = ClockHelper.forPrecision( baseClock, precision, 3 ); - return () -> { - Calendar calendar = Calendar.getInstance(); - calendar.setTimeInMillis( clock.millis() ); - return calendar; - }; - } - ); - GENERATOR_PRODUCERS.put( - java.sql.Date.class, - (baseClock, precision) -> () -> new java.sql.Date( baseClock == null ? System.currentTimeMillis() : baseClock.millis() ) - ); - - GENERATOR_PRODUCERS.put( - Time.class, - (baseClock, precision) -> { - final Clock clock = ClockHelper.forPrecision( baseClock, precision, 3 ); - return () -> new Time( clock.millis() ); - } - ); - GENERATOR_PRODUCERS.put( - Timestamp.class, - (baseClock, precision) -> { - final Clock clock = ClockHelper.forPrecision( baseClock, precision, 9 ); - return () -> Timestamp.from( clock.instant() ); - } - ); - GENERATOR_PRODUCERS.put( - Instant.class, - (baseClock, precision) -> { - final Clock clock = ClockHelper.forPrecision( baseClock, precision, 9 ); - return clock::instant; - } - ); - GENERATOR_PRODUCERS.put( - LocalDate.class, - (baseClock, precision) -> () -> LocalDate.now( baseClock == null ? Clock.systemDefaultZone() : baseClock ) - ); - GENERATOR_PRODUCERS.put( - LocalDateTime.class, - (baseClock, precision) -> { - final Clock clock = ClockHelper.forPrecision( baseClock, precision, 9 ); - return () -> LocalDateTime.now( clock ); - } - ); - GENERATOR_PRODUCERS.put( - LocalTime.class, - (baseClock, precision) -> { - final Clock clock = ClockHelper.forPrecision( baseClock, precision, 9 ); - return () -> LocalTime.now( clock ); - } - ); - GENERATOR_PRODUCERS.put( - MonthDay.class, - (baseClock, precision) -> () -> MonthDay.now( baseClock == null ? Clock.systemDefaultZone() : baseClock ) - ); - GENERATOR_PRODUCERS.put( - OffsetDateTime.class, - (baseClock, precision) -> { - final Clock clock = ClockHelper.forPrecision( baseClock, precision, 9 ); - return () -> OffsetDateTime.now( clock ); - } - ); - GENERATOR_PRODUCERS.put( - OffsetTime.class, - (baseClock, precision) -> { - final Clock clock = ClockHelper.forPrecision( baseClock, precision, 9 ); - return () -> OffsetTime.now( clock ); - } - ); - GENERATOR_PRODUCERS.put( - Year.class, - (baseClock, precision) -> () -> Year.now( baseClock == null ? Clock.systemDefaultZone() : baseClock ) - ); - GENERATOR_PRODUCERS.put( - YearMonth.class, - (baseClock, precision) -> () -> YearMonth.now( baseClock == null ? Clock.systemDefaultZone() : baseClock ) - ); - GENERATOR_PRODUCERS.put( - ZonedDateTime.class, - (baseClock, precision) -> { - final Clock clock = ClockHelper.forPrecision( baseClock, precision, 9 ); - return () -> ZonedDateTime.now( clock ); - } - ); - } + private static final ConcurrentHashMap GENERATOR_DELEGATES = new ConcurrentHashMap<>(); public CurrentTimestampGeneration(CurrentTimestamp annotation, Member member, GeneratorCreationContext context) { delegate = getGeneratorDelegate( annotation.source(), member, context ); @@ -209,43 +104,43 @@ public CurrentTimestampGeneration(UpdateTimestamp annotation, Member member, Gen propertyType = getPropertyType( context ); } - private static CurrentTimestampGeneratorDelegate getGeneratorDelegate( + private static GeneratorDelegate getGeneratorDelegate( SourceType source, Member member, GeneratorCreationContext context) { return getGeneratorDelegate( source, ReflectHelper.getPropertyType( member ), context ); } - static CurrentTimestampGeneratorDelegate getGeneratorDelegate( + static GeneratorDelegate getGeneratorDelegate( SourceType source, Class propertyType, GeneratorCreationContext context) { return switch (source) { case DB -> null; - case VM -> { - // Generator is only used for in-VM generation - final Key key = new Key( propertyType, getBaseClock( context ), getPrecision( context ) ); - final var delegate = GENERATOR_DELEGATES.get( key ); - if ( delegate != null ) { - yield delegate; - } - else { - final var producer = GENERATOR_PRODUCERS.get( key.clazz ); - if ( producer == null ) { - yield null; - } - else { - final var generatorDelegate = producer.apply( key.clock, key.precision ); - final var old = GENERATOR_DELEGATES.putIfAbsent( key, generatorDelegate ); - yield old != null ? old : generatorDelegate; - } - } - } + case VM -> getGeneratorDelegate( propertyType, getBaseClock( context ), getPrecision( context ) ); }; } + private static GeneratorDelegate getGeneratorDelegate(Class propertyType, Clock baseClock, int precision) { + final var key = new Key( propertyType, baseClock, precision ); + final var delegate = GENERATOR_DELEGATES.get( key ); + if ( delegate != null ) { + return delegate; + } + else { + final var generatorDelegate = generatorDelegate( propertyType, baseClock, precision ); + if ( generatorDelegate == null ) { + return null; + } + else { + final var old = GENERATOR_DELEGATES.putIfAbsent( key, generatorDelegate ); + return old != null ? old : generatorDelegate; + } + } + } + private static int getPrecision(GeneratorCreationContext context) { - final BasicValue basicValue = (BasicValue) context.getProperty().getValue(); + final var basicValue = (BasicValue) context.getProperty().getValue(); final Size size = basicValue.getColumns().get( 0 ) .getColumnSize( context.getDatabase().getDialect(), @@ -305,16 +200,8 @@ public String[] getReferencedColumnValues(Dialect dialect) { return new String[] { dialect.currentTimestamp() }; } - interface CurrentTimestampGeneratorDelegate { - // Left out the Generator params, they're not used anyway. Since this is purely internal, this can be changed if needed - Object generate(); - } - - private record Key(Class clazz, @Nullable Clock clock, int precision) { - } - static Timestamp getCurrentTimestamp(SharedSessionContractImplementor session) { - final Dialect dialect = session.getJdbcServices().getJdbcEnvironment().getDialect(); + final var dialect = session.getJdbcServices().getJdbcEnvironment().getDialect(); return getCurrentTimestampFromDatabase( dialect.getCurrentTimestampSelectString(), dialect.isCurrentTimestampSelectStringCallable(), @@ -326,8 +213,8 @@ static Timestamp getCurrentTimestampFromDatabase( String timestampSelectString, boolean callable, SharedSessionContractImplementor session) { - final JdbcCoordinator coordinator = session.getJdbcCoordinator(); - final StatementPreparer statementPreparer = coordinator.getStatementPreparer(); + final var coordinator = session.getJdbcCoordinator(); + final var statementPreparer = coordinator.getStatementPreparer(); PreparedStatement statement = null; try { statement = statementPreparer.prepareStatement( timestampSelectString, callable ); @@ -356,16 +243,92 @@ static Timestamp getCurrentTimestampFromDatabase( static Timestamp extractResult(PreparedStatement statement, JdbcCoordinator coordinator, String sql) throws SQLException { - final ResultSet resultSet = coordinator.getResultSetReturn().extract( statement, sql ); + final var resultSet = coordinator.getResultSetReturn().extract( statement, sql ); resultSet.next(); return resultSet.getTimestamp( 1 ); } static Timestamp extractCalledResult(PreparedStatement statement, JdbcCoordinator coordinator, String sql) throws SQLException { - final CallableStatement callable = (CallableStatement) statement; + final var callable = (CallableStatement) statement; callable.registerOutParameter( 1, TIMESTAMP ); coordinator.getResultSetReturn().execute( callable, sql ); return callable.getTimestamp( 1 ); } + + @FunctionalInterface + interface GeneratorDelegate { + // Left out the Generator params, they're not used anyway. + // Since this is purely internal, this can be changed if needed. + Object generate(); + } + + private record Key(Class clazz, @Nullable Clock clock, int precision) { + } + + private static GeneratorDelegate generatorDelegate(Class clazz, @Nullable Clock baseClock, int precision) { + if ( clazz == Instant.class ) { + final var clock = ClockHelper.forPrecision( baseClock, precision, 9 ); + return clock::instant; + } + else if ( clazz == LocalDateTime.class ) { + final var clock = ClockHelper.forPrecision( baseClock, precision, 9 ); + return () -> LocalDateTime.now( clock ); + } + else if ( clazz == LocalDate.class ) { + return () -> LocalDate.now( baseClock == null ? Clock.systemDefaultZone() : baseClock ); + } + else if ( clazz == LocalTime.class ) { + final var clock = ClockHelper.forPrecision( baseClock, precision, 9 ); + return () -> LocalTime.now( clock ); + } + else if ( clazz == OffsetDateTime.class ) { + final var clock = ClockHelper.forPrecision( baseClock, precision, 9 ); + return () -> OffsetDateTime.now( clock ); + } + else if ( clazz == OffsetTime.class ) { + final var clock = ClockHelper.forPrecision( baseClock, precision, 9 ); + return () -> OffsetTime.now( clock ); + } + else if ( clazz == ZonedDateTime.class ) { + final var clock = ClockHelper.forPrecision( baseClock, precision, 9 ); + return () -> ZonedDateTime.now( clock ); + } + else if ( clazz == Year.class ) { + return () -> Year.now( baseClock == null ? Clock.systemDefaultZone() : baseClock ); + } + else if ( clazz == YearMonth.class ) { + return () -> YearMonth.now( baseClock == null ? Clock.systemDefaultZone() : baseClock ); + } + else if ( clazz == MonthDay.class ) { + return () -> MonthDay.now( baseClock == null ? Clock.systemDefaultZone() : baseClock ); + } + // DEPRECATED: + else if ( clazz == Date.class ) { + final var clock = ClockHelper.forPrecision( baseClock, precision, 3 ); + return () -> new Date( clock.millis() ); + } + else if ( clazz == Calendar.class ) { + final var clock = ClockHelper.forPrecision( baseClock, precision, 3 ); + return () -> { + var calendar = Calendar.getInstance(); + calendar.setTimeInMillis( clock.millis() ); + return calendar; + }; + } + else if ( clazz == java.sql.Timestamp.class ) { + final var clock = ClockHelper.forPrecision( baseClock, precision, 9 ); + return () -> java.sql.Timestamp.from( clock.instant() ); + } + else if ( clazz == java.sql.Date.class ) { + return () -> new java.sql.Date( baseClock == null ? System.currentTimeMillis() : baseClock.millis() ); + } + else if ( clazz == java.sql.Time.class ) { + final var clock = ClockHelper.forPrecision( baseClock, precision, 3 ); + return () -> new java.sql.Time( clock.millis() ); + } + else { + return null; + } + } } diff --git a/hibernate-core/src/main/java/org/hibernate/generator/internal/GeneratedGeneration.java b/hibernate-core/src/main/java/org/hibernate/generator/internal/GeneratedGeneration.java index c996fd3c8536..163b84a06b78 100644 --- a/hibernate-core/src/main/java/org/hibernate/generator/internal/GeneratedGeneration.java +++ b/hibernate-core/src/main/java/org/hibernate/generator/internal/GeneratedGeneration.java @@ -10,7 +10,6 @@ import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.generator.EventType; import org.hibernate.generator.OnExecutionGenerator; -import org.hibernate.persister.entity.EntityPersister; import java.util.EnumSet; @@ -75,7 +74,7 @@ public boolean writePropertyValue() { public boolean generatedOnExecution(Object entity, SharedSessionContractImplementor session) { if ( writable ) { // When this is the identifier generator and writable is true, allow pre-assigned identifiers - final EntityPersister entityPersister = session.getEntityPersister( null, entity ); + final var entityPersister = session.getEntityPersister( null, entity ); return entityPersister.getGenerator() != this || entityPersister.getIdentifier( entity, session ) == null; } diff --git a/hibernate-core/src/main/java/org/hibernate/generator/internal/SourceGeneration.java b/hibernate-core/src/main/java/org/hibernate/generator/internal/SourceGeneration.java index da1a7d3d2559..dd7a014c3f08 100644 --- a/hibernate-core/src/main/java/org/hibernate/generator/internal/SourceGeneration.java +++ b/hibernate-core/src/main/java/org/hibernate/generator/internal/SourceGeneration.java @@ -42,7 +42,7 @@ public class SourceGeneration implements BeforeExecutionGenerator { private final JavaType propertyType; - private final CurrentTimestampGeneration.CurrentTimestampGeneratorDelegate valueGenerator; + private final CurrentTimestampGeneration.GeneratorDelegate valueGenerator; public SourceGeneration(Source annotation, Member member, GeneratorCreationContext context) { this( annotation.value(), context.getProperty().getType().getReturnedClass(), context ); diff --git a/hibernate-core/src/main/java/org/hibernate/generator/internal/TenantIdGeneration.java b/hibernate-core/src/main/java/org/hibernate/generator/internal/TenantIdGeneration.java index 47ee016b1ba0..2c122d94d844 100644 --- a/hibernate-core/src/main/java/org/hibernate/generator/internal/TenantIdGeneration.java +++ b/hibernate-core/src/main/java/org/hibernate/generator/internal/TenantIdGeneration.java @@ -9,13 +9,11 @@ import org.hibernate.PropertyValueException; import org.hibernate.annotations.TenantId; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.generator.BeforeExecutionGenerator; import org.hibernate.generator.EventType; import org.hibernate.generator.EventTypeSets; import org.hibernate.generator.GeneratorCreationContext; -import org.hibernate.type.descriptor.java.JavaType; import static org.hibernate.generator.EventTypeSets.INSERT_ONLY; @@ -47,7 +45,7 @@ public EnumSet getEventTypes() { @Override public Object generate(SharedSessionContractImplementor session, Object owner, Object currentValue, EventType eventType) { - final SessionFactoryImplementor sessionFactory = session.getSessionFactory(); + final var sessionFactory = session.getSessionFactory(); final Object tenantId = session.getTenantIdentifierValue(); if ( currentValue != null ) { final var resolver = sessionFactory.getCurrentTenantIdentifierResolver(); @@ -56,7 +54,7 @@ public Object generate(SharedSessionContractImplementor session, Object owner, O return currentValue; } else { - final JavaType tenantIdJavaType = sessionFactory.getTenantIdentifierJavaType(); + final var tenantIdJavaType = sessionFactory.getTenantIdentifierJavaType(); if ( !tenantIdJavaType.areEqual( currentValue, tenantId ) ) { throw new PropertyValueException( "assigned tenant id differs from current tenant id [" diff --git a/hibernate-core/src/main/java/org/hibernate/generator/values/AbstractGeneratedValuesMutationDelegate.java b/hibernate-core/src/main/java/org/hibernate/generator/values/AbstractGeneratedValuesMutationDelegate.java index c99ce50bcb7c..315195898e0e 100644 --- a/hibernate-core/src/main/java/org/hibernate/generator/values/AbstractGeneratedValuesMutationDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/generator/values/AbstractGeneratedValuesMutationDelegate.java @@ -6,11 +6,12 @@ import org.hibernate.dialect.Dialect; import org.hibernate.generator.EventType; -import org.hibernate.generator.values.internal.GeneratedValuesHelper; import org.hibernate.generator.values.internal.GeneratedValuesMappingProducer; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.sql.results.jdbc.spi.JdbcValuesMappingProducer; +import static org.hibernate.generator.values.internal.GeneratedValuesHelper.createMappingProducer; + /** * @author Marco Belladelli */ @@ -34,12 +35,8 @@ public AbstractGeneratedValuesMutationDelegate( this.timing = timing; this.supportsArbitraryValues = supportsArbitraryValues; this.supportsRowId = supportsRowId; - this.jdbcValuesMappingProducer = GeneratedValuesHelper.createMappingProducer( - persister, - timing, - supportsArbitraryValues, - supportsRowId - ); + this.jdbcValuesMappingProducer = + createMappingProducer( persister, timing, supportsArbitraryValues, supportsRowId ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/generator/values/GeneratedValueBasicResultBuilder.java b/hibernate-core/src/main/java/org/hibernate/generator/values/GeneratedValueBasicResultBuilder.java index 45aafc823921..e28111be22f0 100644 --- a/hibernate-core/src/main/java/org/hibernate/generator/values/GeneratedValueBasicResultBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/generator/values/GeneratedValueBasicResultBuilder.java @@ -71,7 +71,7 @@ public BasicResult buildResult( private SqlSelection sqlSelection( JdbcValuesMetadata jdbcResultsMetadata, DomainResultCreationState domainResultCreationState) { - final DomainResultCreationStateImpl creationStateImpl = impl( domainResultCreationState ); + final var creationStateImpl = impl( domainResultCreationState ); return sqlSelection( jdbcResultsMetadata, creationStateImpl, tableReference( creationStateImpl ) ); } diff --git a/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesHelper.java b/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesHelper.java index ac2fb45410c1..53f4f37074ff 100644 --- a/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesHelper.java @@ -35,7 +35,6 @@ import org.hibernate.sql.ast.tree.from.NamedTableReference; import org.hibernate.sql.ast.tree.from.TableGroup; import org.hibernate.sql.exec.internal.BaseExecutionContext; -import org.hibernate.sql.model.TableMapping; import org.hibernate.sql.results.internal.ResultsHelper; import org.hibernate.sql.results.internal.RowProcessingStateStandardImpl; import org.hibernate.sql.results.internal.RowTransformerArrayImpl; @@ -188,7 +187,7 @@ private static GeneratedValuesMappingProducer generatedValuesMappingProducer( EntityPersister persister, boolean supportsArbitraryValues, List generatedProperties) { - final NavigablePath parentNavigablePath = new NavigablePath( persister.getEntityName() ); + final var parentNavigablePath = new NavigablePath( persister.getEntityName() ); // This is just a mock table group needed to correctly resolve expressions final TableGroup tableGroup = new TableGroupImpl( parentNavigablePath, @@ -313,7 +312,7 @@ private static boolean supportsReturning(Dialect dialect, EventType timing) { public static boolean noCustomSql(EntityPersister persister, EventType timing) { final var identifierTable = persister.getIdentifierTableMapping(); - final TableMapping.MutationDetails mutationDetails = + final var mutationDetails = timing == EventType.INSERT ? identifierTable.getInsertDetails() : identifierTable.getUpdateDetails(); diff --git a/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesImpl.java b/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesImpl.java index 9f18dc6060ad..a3ae448e5fe9 100644 --- a/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesImpl.java @@ -44,7 +44,7 @@ public List getGeneratedValues(List modelParts) { } final List generatedValues = new ArrayList<>( modelParts.size() ); - for ( ModelPart modelPart : modelParts ) { + for ( var modelPart : modelParts ) { assert generatedValuesMap.containsKey( modelPart ); generatedValues.add( generatedValuesMap.get( modelPart ) ); } diff --git a/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/ClockHelper.java b/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/ClockHelper.java index 9ca3cab54578..e5ddf49d395a 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/ClockHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/ClockHelper.java @@ -33,16 +33,13 @@ public static Clock forPrecision(Integer precision, SharedSessionContractImpleme } public static Clock forPrecision(Integer precision, SharedSessionContractImplementor session, int maxPrecision) { - final int resolvedPrecision; - if ( precision == null ) { - resolvedPrecision = session.getJdbcServices().getDialect().getDefaultTimestampPrecision(); - } - else { - resolvedPrecision = precision; - } - final Clock baseClock = (Clock) session.getFactory() - .getProperties() - .get( CurrentTimestampGeneration.CLOCK_SETTING_NAME ); + final int resolvedPrecision = + precision == null + ? session.getJdbcServices().getDialect().getDefaultTimestampPrecision() + : precision; + final var baseClock = (Clock) + session.getFactory().getProperties() + .get( CurrentTimestampGeneration.CLOCK_SETTING_NAME ); return forPrecision( baseClock, resolvedPrecision, maxPrecision ); } @@ -51,28 +48,18 @@ public static Clock forPrecision(int resolvedPrecision, int maxPrecision) { } public static Clock forPrecision(@Nullable Clock baseClock, int resolvedPrecision, int maxPrecision) { - switch ( Math.min( resolvedPrecision, maxPrecision ) ) { - case 0: - return baseClock == null ? TICK_0 : Clock.tick( baseClock, Duration.ofNanos( 1000000000L ) ); - case 1: - return baseClock == null ? TICK_1 : Clock.tick( baseClock, Duration.ofNanos( 100000000L ) ); - case 2: - return baseClock == null ? TICK_2 : Clock.tick( baseClock, Duration.ofNanos( 10000000L ) ); - case 3: - return baseClock == null ? TICK_3 : Clock.tick( baseClock, Duration.ofNanos( 1000000L ) ); - case 4: - return baseClock == null ? TICK_4 : Clock.tick( baseClock, Duration.ofNanos( 100000L ) ); - case 5: - return baseClock == null ? TICK_5 : Clock.tick( baseClock, Duration.ofNanos( 10000L ) ); - case 6: - return baseClock == null ? TICK_6 : Clock.tick( baseClock, Duration.ofNanos( 1000L ) ); - case 7: - return baseClock == null ? TICK_7 : Clock.tick( baseClock, Duration.ofNanos( 100L ) ); - case 8: - return baseClock == null ? TICK_8 : Clock.tick( baseClock, Duration.ofNanos( 10L ) ); - case 9: - return baseClock == null ? TICK_9 : baseClock; - } - throw new IllegalArgumentException( "Illegal precision: " + resolvedPrecision ); + return switch ( Math.min( resolvedPrecision, maxPrecision ) ) { + case 0 -> baseClock == null ? TICK_0 : Clock.tick( baseClock, Duration.ofNanos( 1000000000L ) ); + case 1 -> baseClock == null ? TICK_1 : Clock.tick( baseClock, Duration.ofNanos( 100000000L ) ); + case 2 -> baseClock == null ? TICK_2 : Clock.tick( baseClock, Duration.ofNanos( 10000000L ) ); + case 3 -> baseClock == null ? TICK_3 : Clock.tick( baseClock, Duration.ofNanos( 1000000L ) ); + case 4 -> baseClock == null ? TICK_4 : Clock.tick( baseClock, Duration.ofNanos( 100000L ) ); + case 5 -> baseClock == null ? TICK_5 : Clock.tick( baseClock, Duration.ofNanos( 10000L ) ); + case 6 -> baseClock == null ? TICK_6 : Clock.tick( baseClock, Duration.ofNanos( 1000L ) ); + case 7 -> baseClock == null ? TICK_7 : Clock.tick( baseClock, Duration.ofNanos( 100L ) ); + case 8 -> baseClock == null ? TICK_8 : Clock.tick( baseClock, Duration.ofNanos( 10L ) ); + case 9 -> baseClock == null ? TICK_9 : baseClock; + default -> throw new IllegalArgumentException( "Illegal precision: " + resolvedPrecision ); + }; } }