From bae63045461ba14e4104ef042627e72d3a77f8f0 Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Wed, 16 Aug 2023 10:45:30 +0200 Subject: [PATCH] HHH-17086 Make JSON/XML format mappers modifiable in SessionFactoryOptionsBuilder --- .../hibernate/boot/SessionFactoryBuilder.java | 26 +++++++++++++++++++ .../internal/SessionFactoryBuilderImpl.java | 13 ++++++++++ .../SessionFactoryOptionsBuilder.java | 12 +++++++-- ...stractDelegatingSessionFactoryBuilder.java | 13 ++++++++++ .../org/hibernate/cfg/AvailableSettings.java | 3 +++ 5 files changed, 65 insertions(+), 2 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/boot/SessionFactoryBuilder.java b/hibernate-core/src/main/java/org/hibernate/boot/SessionFactoryBuilder.java index aae26df31f..2b30268d3c 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/SessionFactoryBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/SessionFactoryBuilder.java @@ -10,6 +10,7 @@ import java.util.function.Supplier; import org.hibernate.CustomEntityDirtinessStrategy; import org.hibernate.EntityNameResolver; +import org.hibernate.Incubating; import org.hibernate.Interceptor; import org.hibernate.SessionFactory; import org.hibernate.SessionFactoryObserver; @@ -22,6 +23,7 @@ import org.hibernate.query.sqm.NullPrecedence; import org.hibernate.query.sqm.function.SqmFunctionDescriptor; import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode; import org.hibernate.resource.jdbc.spi.StatementInspector; +import org.hibernate.type.format.FormatMapper; /** * The contract for building a {@link SessionFactory} given a number of options. @@ -696,6 +698,30 @@ public interface SessionFactoryBuilder { */ SessionFactoryBuilder enableJpaClosedCompliance(boolean enabled); + /** + * Specifies a {@link FormatMapper format mapper} to use for serialization/deserialization of JSON properties. + * + * @param jsonFormatMapper The {@link FormatMapper} to use. + * + * @return {@code this}, for method chaining + * + * @see org.hibernate.cfg.AvailableSettings#JSON_FORMAT_MAPPER + */ + @Incubating + SessionFactoryBuilder applyJsonFormatMapper(FormatMapper jsonFormatMapper); + + /** + * Specifies a {@link FormatMapper format mapper} to use for serialization/deserialization of XML properties. + * + * @param xmlFormatMapper The {@link FormatMapper} to use. + * + * @return {@code this}, for method chaining + * + * @see org.hibernate.cfg.AvailableSettings#XML_FORMAT_MAPPER + */ + @Incubating + SessionFactoryBuilder applyXmlFormatMapper(FormatMapper xmlFormatMapper); + /** * After all options have been set, build the SessionFactory. * diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryBuilderImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryBuilderImpl.java index e29ece41fa..9318852dc7 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryBuilderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryBuilderImpl.java @@ -31,6 +31,7 @@ import org.hibernate.query.sqm.NullPrecedence; import org.hibernate.query.sqm.function.SqmFunctionDescriptor; import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode; import org.hibernate.resource.jdbc.spi.StatementInspector; +import org.hibernate.type.format.FormatMapper; /** * @author Gail Badner @@ -416,6 +417,18 @@ public class SessionFactoryBuilderImpl implements SessionFactoryBuilderImplement return this; } + @Override + public SessionFactoryBuilder applyJsonFormatMapper(FormatMapper jsonFormatMapper) { + this.optionsBuilder.applyJsonFormatMapper( jsonFormatMapper ); + return this; + } + + @Override + public SessionFactoryBuilder applyXmlFormatMapper(FormatMapper xmlFormatMapper) { + this.optionsBuilder.applyXmlFormatMapper( xmlFormatMapper ); + return this; + } + @Override public void disableRefreshDetachedEntity() { this.optionsBuilder.disableRefreshDetachedEntity(); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java index 0df65f48d2..31fda41536 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java @@ -155,8 +155,8 @@ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { // integration private Object beanManagerReference; private Object validatorFactoryReference; - private final FormatMapper jsonFormatMapper; - private final FormatMapper xmlFormatMapper; + private FormatMapper jsonFormatMapper; + private FormatMapper xmlFormatMapper; // SessionFactory behavior private final boolean jpaBootstrap; @@ -1238,6 +1238,14 @@ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { this.validatorFactoryReference = validatorFactory; } + public void applyJsonFormatMapper(FormatMapper jsonFormatMapper) { + this.jsonFormatMapper = jsonFormatMapper; + } + + public void applyXmlFormatMapper(FormatMapper xmlFormatMapper) { + this.xmlFormatMapper = xmlFormatMapper; + } + public void applySessionFactoryName(String sessionFactoryName) { this.sessionFactoryName = sessionFactoryName; } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/spi/AbstractDelegatingSessionFactoryBuilder.java b/hibernate-core/src/main/java/org/hibernate/boot/spi/AbstractDelegatingSessionFactoryBuilder.java index df34075fba..d6f0eb3a7f 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/spi/AbstractDelegatingSessionFactoryBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/spi/AbstractDelegatingSessionFactoryBuilder.java @@ -23,6 +23,7 @@ import org.hibernate.query.sqm.NullPrecedence; import org.hibernate.query.sqm.function.SqmFunctionDescriptor; import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode; import org.hibernate.resource.jdbc.spi.StatementInspector; +import org.hibernate.type.format.FormatMapper; /** * Convenience base class for custom implementors of SessionFactoryBuilder, using delegation @@ -390,6 +391,18 @@ public abstract class AbstractDelegatingSessionFactoryBuilder