Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor Hibernate mapping to use groups instead of dotted names #34655

Merged
merged 1 commit into from
Jul 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -341,71 +341,98 @@ public boolean isAnyPropertySet() {
@ConfigGroup
public static class HibernateOrmConfigPersistenceUnitMapping {
/**
* How to store timezones in the database by default
* for properties of type `OffsetDateTime` and `ZonedDateTime`.
*
* This default may be overridden on a per-property basis using `@TimeZoneStorage`.
*
* NOTE: Properties of type `OffsetTime` are https://hibernate.atlassian.net/browse/HHH-16287[not affected by this
* setting].
*
* `default`::
* Equivalent to `native` if supported, `normalize-utc` otherwise.
* `auto`::
* Equivalent to `native` if supported, `column` otherwise.
* `native`::
* Stores the timestamp and timezone in a column of type `timestamp with time zone`.
* +
* Only available on some databases/dialects;
* if not supported, an exception will be thrown during static initialization.
* `column`::
* Stores the timezone in a separate column next to the timestamp column.
* +
* Use `@TimeZoneColumn` on the relevant entity property to customize the timezone column.
* `normalize-utc`::
* Does not store the timezone, and loses timezone information upon persisting.
* +
* Instead, normalizes the value to a timestamp in the UTC timezone.
* `normalize`::
* Does not store the timezone, and loses timezone information upon persisting.
* +
* Instead, normalizes the value:
* * upon persisting to the database, to a timestamp in the JDBC timezone
* set through `quarkus.hibernate-orm.jdbc.timezone`,
* or the JVM default timezone if not set.
* * upon reading back from the database, to the JVM default timezone.
* +
* Use this to get the legacy behavior of Quarkus 2 / Hibernate ORM 5 or older.
*
* @asciidoclet
* Timezone configuration.
*/
@ConfigItem(name = "timezone.default-storage", defaultValueDocumentation = "default")
public Optional<TimeZoneStorageType> timeZoneDefaultStorage;
@ConfigItem
public Timezone timezone;

/**
* The optimizer to apply to identifier generators
* whose optimizer is not configured explicitly.
*
* Only relevant for table- and sequence-based identifier generators.
* Other generators, such as UUID-based generators, will ignore this setting.
*
* The optimizer is responsible for pooling new identifier values,
* in order to reduce the frequency of database calls to retrieve those values
* and thereby improve performance.
*
* @asciidoclet
* Optimizer configuration.
*/
@ConfigItem(name = "id.optimizer.default", defaultValueDocumentation = "pooled-lo")
// Note this needs to be a build-time property due to
// org.hibernate.boot.internal.InFlightMetadataCollectorImpl.handleIdentifierValueBinding
// which may call (indirectly) org.hibernate.id.enhanced.SequenceStructure.buildSequence
// whose output depends on org.hibernate.id.enhanced.SequenceStructure.applyIncrementSizeToSourceValues
// which is determined by the optimizer.
public Optional<IdOptimizerType> idOptimizerDefault;
@ConfigItem
public Id id;

@ConfigGroup
public static class Timezone {
/**
* How to store timezones in the database by default
* for properties of type `OffsetDateTime` and `ZonedDateTime`.
*
* This default may be overridden on a per-property basis using `@TimeZoneStorage`.
*
* NOTE: Properties of type `OffsetTime` are https://hibernate.atlassian.net/browse/HHH-16287[not affected by this
* setting].
*
* `default`::
* Equivalent to `native` if supported, `normalize-utc` otherwise.
* `auto`::
* Equivalent to `native` if supported, `column` otherwise.
* `native`::
* Stores the timestamp and timezone in a column of type `timestamp with time zone`.
* +
* Only available on some databases/dialects;
* if not supported, an exception will be thrown during static initialization.
* `column`::
* Stores the timezone in a separate column next to the timestamp column.
* +
* Use `@TimeZoneColumn` on the relevant entity property to customize the timezone column.
* `normalize-utc`::
* Does not store the timezone, and loses timezone information upon persisting.
* +
* Instead, normalizes the value to a timestamp in the UTC timezone.
* `normalize`::
* Does not store the timezone, and loses timezone information upon persisting.
* +
* Instead, normalizes the value:
* * upon persisting to the database, to a timestamp in the JDBC timezone
* set through `quarkus.hibernate-orm.jdbc.timezone`,
* or the JVM default timezone if not set.
* * upon reading back from the database, to the JVM default timezone.
* +
* Use this to get the legacy behavior of Quarkus 2 / Hibernate ORM 5 or older.
*
* @asciidoclet
*/
@ConfigItem(name = "default-storage", defaultValueDocumentation = "default")
public Optional<TimeZoneStorageType> timeZoneDefaultStorage;
}

@ConfigGroup
public static class Id {
/**
* Optimizer configuration.
*/
@ConfigItem
public Optimizer optimizer;

@ConfigGroup
public static class Optimizer {
/**
* The optimizer to apply to identifier generators
* whose optimizer is not configured explicitly.
*
* Only relevant for table- and sequence-based identifier generators.
* Other generators, such as UUID-based generators, will ignore this setting.
*
* The optimizer is responsible for pooling new identifier values,
* in order to reduce the frequency of database calls to retrieve those values
* and thereby improve performance.
*
* @asciidoclet
*/
@ConfigItem(name = "default", defaultValueDocumentation = "pooled-lo")
// Note this needs to be a build-time property due to
// org.hibernate.boot.internal.InFlightMetadataCollectorImpl.handleIdentifierValueBinding
// which may call (indirectly) org.hibernate.id.enhanced.SequenceStructure.buildSequence
// whose output depends on org.hibernate.id.enhanced.SequenceStructure.applyIncrementSizeToSourceValues
// which is determined by the optimizer.
public Optional<IdOptimizerType> idOptimizerDefault;
}
}

public boolean isAnyPropertySet() {
return timeZoneDefaultStorage.isPresent()
|| idOptimizerDefault.isPresent();
return timezone.timeZoneDefaultStorage.isPresent()
|| id.optimizer.idOptimizerDefault.isPresent();
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -953,12 +953,12 @@ private static void producePersistenceUnitDescriptorFromConfig(
.setProperty(EntityManagerFactoryBuilderImpl.METADATA_BUILDER_CONTRIBUTOR, className));

// Mapping
if (persistenceUnitConfig.mapping.timeZoneDefaultStorage.isPresent()) {
if (persistenceUnitConfig.mapping.timezone.timeZoneDefaultStorage.isPresent()) {
descriptor.getProperties().setProperty(AvailableSettings.TIMEZONE_DEFAULT_STORAGE,
persistenceUnitConfig.mapping.timeZoneDefaultStorage.get().name());
persistenceUnitConfig.mapping.timezone.timeZoneDefaultStorage.get().name());
}
descriptor.getProperties().setProperty(AvailableSettings.PREFERRED_POOLED_OPTIMIZER,
persistenceUnitConfig.mapping.idOptimizerDefault
persistenceUnitConfig.mapping.id.optimizer.idOptimizerDefault
.orElse(HibernateOrmConfigPersistenceUnit.IdOptimizerType.POOLED_LO).configName);

//charset
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -286,12 +286,12 @@ private static ParsedPersistenceXmlDescriptor generateReactivePersistenceUnit(
.setProperty(AvailableSettings.IMPLICIT_NAMING_STRATEGY, namingStrategy));

// Mapping
if (persistenceUnitConfig.mapping.timeZoneDefaultStorage.isPresent()) {
if (persistenceUnitConfig.mapping.timezone.timeZoneDefaultStorage.isPresent()) {
desc.getProperties().setProperty(AvailableSettings.TIMEZONE_DEFAULT_STORAGE,
persistenceUnitConfig.mapping.timeZoneDefaultStorage.get().name());
persistenceUnitConfig.mapping.timezone.timeZoneDefaultStorage.get().name());
}
desc.getProperties().setProperty(AvailableSettings.PREFERRED_POOLED_OPTIMIZER,
persistenceUnitConfig.mapping.idOptimizerDefault
persistenceUnitConfig.mapping.id.optimizer.idOptimizerDefault
.orElse(HibernateOrmConfigPersistenceUnit.IdOptimizerType.POOLED_LO).configName);

//charset
Expand Down