From 285f05b1048514e25b92a06ee534c85af2d351a0 Mon Sep 17 00:00:00 2001 From: jbosca Date: Tue, 30 Jun 2020 15:20:30 +0200 Subject: [PATCH 1/5] Added a new feature to disable wrapping of identifiers during proxy serialization. --- .../datatype/hibernate4/Hibernate4Module.java | 28 ++++---- .../hibernate4/HibernateProxySerializer.java | 66 ++++++++++++------- .../hibernate4/HibernateSerializers.java | 4 +- 3 files changed, 61 insertions(+), 37 deletions(-) diff --git a/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/Hibernate4Module.java b/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/Hibernate4Module.java index 396a319c..f87e0570 100644 --- a/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/Hibernate4Module.java +++ b/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/Hibernate4Module.java @@ -28,21 +28,21 @@ public enum Feature { * Default value is true. */ USE_TRANSIENT_ANNOTATION(true), - + /** * If FORCE_LAZY_LOADING is false, this feature serializes uninitialized lazy loading proxies as - * {"identifierName":"identifierValue"} rather than null. + * {"identifierName":"identifierValue"} rather than null. *

* Default value is false. *

- * Note that the name of the identifier property can only be determined if + * Note that the name of the identifier property can only be determined if *

- * Otherwise, the entity name will be used instead. + * Otherwise, the entity name will be used instead. */ SERIALIZE_IDENTIFIER_FOR_LAZY_NOT_LOADED_OBJECTS(false), @@ -58,7 +58,7 @@ public enum Feature { *

* Default value is false, meaning that laziness is considered to be the * default value. - * + * * @since 2.4 */ REQUIRE_EXPLICIT_LAZY_LOADING_MARKER(false), @@ -78,7 +78,7 @@ public enum Feature { * @since 2.8.2 */ REPLACE_PERSISTENT_COLLECTIONS(false), - + /** * Using {@link #FORCE_LAZY_LOADING} may result in * `javax.persistence.EntityNotFoundException`. This flag configures Jackson to @@ -86,8 +86,14 @@ public enum Feature { * * @since 2.10 */ - WRITE_MISSING_ENTITIES_AS_NULL(false) - ; + WRITE_MISSING_ENTITIES_AS_NULL(false), + + /** + * Feature that may be disables to unwrap the identifier + * of the serialized entity, returning a value instead of + * an object. + */ + WRAP_IDENTIFIER_IN_OBJECT(true); final boolean _defaultState; final int _mask; @@ -106,7 +112,7 @@ public static int collectDefaults() } return flags; } - + private Feature(boolean defaultState) { _defaultState = defaultState; _mask = (1 << ordinal()); @@ -118,7 +124,7 @@ private Feature(boolean defaultState) { } protected final static int DEFAULT_FEATURES = Feature.collectDefaults(); - + /** * Bit flag composed of bits that indicate which * {@link Feature}s diff --git a/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/HibernateProxySerializer.java b/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/HibernateProxySerializer.java index f570a8bf..2a69ea5a 100644 --- a/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/HibernateProxySerializer.java +++ b/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/HibernateProxySerializer.java @@ -1,14 +1,12 @@ package com.fasterxml.jackson.datatype.hibernate4; -import java.beans.Introspector; -import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.HashMap; - -import javax.persistence.EntityNotFoundException; +import org.hibernate.engine.spi.Mapping; +import org.hibernate.engine.spi.SessionImplementor; +import org.hibernate.proxy.HibernateProxy; +import org.hibernate.proxy.LazyInitializer; +import org.hibernate.proxy.pojo.BasicLazyInitializer; -import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.BeanProperty; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonMappingException; @@ -19,11 +17,13 @@ import com.fasterxml.jackson.databind.ser.ContextualSerializer; import com.fasterxml.jackson.databind.ser.impl.PropertySerializerMap; -import org.hibernate.engine.spi.Mapping; -import org.hibernate.engine.spi.SessionImplementor; -import org.hibernate.proxy.HibernateProxy; -import org.hibernate.proxy.LazyInitializer; -import org.hibernate.proxy.pojo.BasicLazyInitializer; +import java.beans.Introspector; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; + +import javax.persistence.EntityNotFoundException; /** * Serializer to use for values proxied using {@link org.hibernate.proxy.HibernateProxy}. @@ -46,6 +46,7 @@ public class HibernateProxySerializer protected final boolean _forceLazyLoading; protected final boolean _serializeIdentifier; protected final boolean _nullMissingEntities; + protected final boolean _wrappedIdentifier; protected final Mapping _mapping; /** @@ -62,26 +63,31 @@ public class HibernateProxySerializer public HibernateProxySerializer(boolean forceLazyLoading) { - this(forceLazyLoading, false, false, null, null); + this(forceLazyLoading, false, false, true, null, null); } public HibernateProxySerializer(boolean forceLazyLoading, boolean serializeIdentifier) { - this(forceLazyLoading, serializeIdentifier, false, null, null); + this(forceLazyLoading, serializeIdentifier, false, true, null, null); } public HibernateProxySerializer(boolean forceLazyLoading, boolean serializeIdentifier, Mapping mapping) { - this(forceLazyLoading, serializeIdentifier, false, mapping, null); + this(forceLazyLoading, serializeIdentifier, false, true, mapping, null); } public HibernateProxySerializer(boolean forceLazyLoading, boolean serializeIdentifier, boolean nullMissingEntities, Mapping mapping) { - this(forceLazyLoading, serializeIdentifier, nullMissingEntities, mapping, null); + this(forceLazyLoading, serializeIdentifier, nullMissingEntities, true, mapping, null); + } + + public HibernateProxySerializer(boolean forceLazyLoading, boolean serializeIdentifier, boolean nullMissingEntities, boolean wrappedIdentifier, Mapping mapping) { + this(forceLazyLoading, serializeIdentifier, nullMissingEntities, wrappedIdentifier, mapping, null); } - public HibernateProxySerializer(boolean forceLazyLoading, boolean serializeIdentifier, boolean nullMissingEntities, Mapping mapping, + public HibernateProxySerializer(boolean forceLazyLoading, boolean serializeIdentifier, boolean nullMissingEntities, boolean wrappedIdentifier, Mapping mapping, BeanProperty property) { _forceLazyLoading = forceLazyLoading; _serializeIdentifier = serializeIdentifier; _nullMissingEntities = nullMissingEntities; + _wrappedIdentifier = wrappedIdentifier; _mapping = mapping; _dynamicSerializers = PropertySerializerMap.emptyForProperties(); _property = property; @@ -90,7 +96,7 @@ public HibernateProxySerializer(boolean forceLazyLoading, boolean serializeIdent @Override public JsonSerializer createContextual(SerializerProvider prov, BeanProperty property) { return new HibernateProxySerializer(this._forceLazyLoading, _serializeIdentifier, _nullMissingEntities, - _mapping, property); + _wrappedIdentifier, _mapping, property); } /* @@ -181,7 +187,11 @@ protected JsonSerializer findSerializer(SerializerProvider provider, Obj * Helper method for finding value being proxied, if it is available * or if it is to be forced to be loaded. */ - protected Object findProxied(HibernateProxy proxy) + protected Object findProxied(final HibernateProxy proxy) { + return findProxied(proxy, _wrappedIdentifier); + } + + private Object findProxied(final HibernateProxy proxy, final boolean asMap) { LazyInitializer init = proxy.getHibernateLazyInitializer(); if (!_forceLazyLoading && init.isUninitialized()) { @@ -196,14 +206,20 @@ protected Object findProxied(HibernateProxy proxy) } else { idName = ProxyReader.getIdentifierPropertyName(init); if (idName == null) { - idName = init.getEntityName(); + idName = init.getEntityName(); } } } - final Object idValue = init.getIdentifier(); - HashMap map = new HashMap(); - map.put(idName, idValue); - return map; + final Object idValue = init.getIdentifier(); + final Object result; + if (asMap) { + final HashMap map = new HashMap<>(); + map.put(idName, idValue); + result = map; + } else { + result = idValue; + } + return result; } return null; } diff --git a/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/HibernateSerializers.java b/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/HibernateSerializers.java index 1e4faaad..a2cb569b 100644 --- a/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/HibernateSerializers.java +++ b/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/HibernateSerializers.java @@ -14,6 +14,7 @@ public class HibernateSerializers extends Serializers.Base protected final boolean _forceLoading; protected final boolean _serializeIdentifiers; protected final boolean _nullMissingEntities; + protected final boolean _wrappedIdentifier; protected final Mapping _mapping; public HibernateSerializers(int features) { @@ -25,6 +26,7 @@ public HibernateSerializers(Mapping mapping, int features) _forceLoading = Feature.FORCE_LAZY_LOADING.enabledIn(features); _serializeIdentifiers = Feature.SERIALIZE_IDENTIFIER_FOR_LAZY_NOT_LOADED_OBJECTS.enabledIn(features); _nullMissingEntities = Feature.WRITE_MISSING_ENTITIES_AS_NULL.enabledIn(features); + _wrappedIdentifier = Feature.WRAP_IDENTIFIER_IN_OBJECT.enabledIn(features); _mapping = mapping; } @@ -34,7 +36,7 @@ public JsonSerializer findSerializer(SerializationConfig config, { Class raw = type.getRawClass(); if (HibernateProxy.class.isAssignableFrom(raw)) { - return new HibernateProxySerializer(_forceLoading, _serializeIdentifiers, _nullMissingEntities, _mapping); + return new HibernateProxySerializer(_forceLoading, _serializeIdentifiers, _nullMissingEntities, _wrappedIdentifier, _mapping); } return null; } From 07dc1e2ed1f60b6e980941155f7ffa101af3a2a7 Mon Sep 17 00:00:00 2001 From: jbosca Date: Wed, 1 Jul 2020 22:09:40 +0200 Subject: [PATCH 2/5] Undo whitespace noise. --- .../hibernate4/HibernateProxySerializer.java | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/HibernateProxySerializer.java b/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/HibernateProxySerializer.java index 2a69ea5a..0872245e 100644 --- a/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/HibernateProxySerializer.java +++ b/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/HibernateProxySerializer.java @@ -1,12 +1,14 @@ package com.fasterxml.jackson.datatype.hibernate4; -import org.hibernate.engine.spi.Mapping; -import org.hibernate.engine.spi.SessionImplementor; -import org.hibernate.proxy.HibernateProxy; -import org.hibernate.proxy.LazyInitializer; -import org.hibernate.proxy.pojo.BasicLazyInitializer; +import java.beans.Introspector; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; + +import javax.persistence.EntityNotFoundException; -import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.databind.BeanProperty; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonMappingException; @@ -17,13 +19,11 @@ import com.fasterxml.jackson.databind.ser.ContextualSerializer; import com.fasterxml.jackson.databind.ser.impl.PropertySerializerMap; -import java.beans.Introspector; -import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.HashMap; - -import javax.persistence.EntityNotFoundException; +import org.hibernate.engine.spi.Mapping; +import org.hibernate.engine.spi.SessionImplementor; +import org.hibernate.proxy.HibernateProxy; +import org.hibernate.proxy.LazyInitializer; +import org.hibernate.proxy.pojo.BasicLazyInitializer; /** * Serializer to use for values proxied using {@link org.hibernate.proxy.HibernateProxy}. @@ -83,7 +83,7 @@ public HibernateProxySerializer(boolean forceLazyLoading, boolean serializeIdent } public HibernateProxySerializer(boolean forceLazyLoading, boolean serializeIdentifier, boolean nullMissingEntities, boolean wrappedIdentifier, Mapping mapping, - BeanProperty property) { + BeanProperty property) { _forceLazyLoading = forceLazyLoading; _serializeIdentifier = serializeIdentifier; _nullMissingEntities = nullMissingEntities; @@ -109,7 +109,7 @@ public JsonSerializer createContextual(SerializerProvider prov, BeanProperty public boolean isEmpty(SerializerProvider provider, HibernateProxy value) { return (value == null) || (findProxied(value) == null); } - + @Override public void serialize(HibernateProxy value, JsonGenerator jgen, SerializerProvider provider) throws IOException @@ -206,7 +206,7 @@ private Object findProxied(final HibernateProxy proxy, final boolean asMap) } else { idName = ProxyReader.getIdentifierPropertyName(init); if (idName == null) { - idName = init.getEntityName(); + idName = init.getEntityName(); } } } @@ -233,7 +233,7 @@ private Object findProxied(final HibernateProxy proxy, final boolean asMap) } } } - + /** * Inspects a Hibernate proxy to try and determine the name of the identifier property * (Hibernate proxies know the getter of the identifier property because it receives special @@ -251,7 +251,7 @@ protected static class ProxyReader { getIdentifierMethodField.setAccessible(true); } catch (Exception e) { // should never happen: the field exists in all versions of hibernate 4 and 5 - throw new RuntimeException(e); + throw new RuntimeException(e); } } From 4f85fec109d71e285272a1c1732057a7227845be Mon Sep 17 00:00:00 2001 From: jbosca Date: Wed, 1 Jul 2020 23:03:07 +0200 Subject: [PATCH 3/5] Optimized logic to retrieve identifier property name only when wrapping identifiers. --- .../hibernate4/HibernateProxySerializer.java | 60 ++++++++++--------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/HibernateProxySerializer.java b/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/HibernateProxySerializer.java index 0872245e..3d46ee06 100644 --- a/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/HibernateProxySerializer.java +++ b/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/HibernateProxySerializer.java @@ -97,7 +97,7 @@ public HibernateProxySerializer(boolean forceLazyLoading, boolean serializeIdent public JsonSerializer createContextual(SerializerProvider prov, BeanProperty property) { return new HibernateProxySerializer(this._forceLazyLoading, _serializeIdentifier, _nullMissingEntities, _wrappedIdentifier, _mapping, property); - } + } /* /********************************************************************** @@ -187,35 +187,17 @@ protected JsonSerializer findSerializer(SerializerProvider provider, Obj * Helper method for finding value being proxied, if it is available * or if it is to be forced to be loaded. */ - protected Object findProxied(final HibernateProxy proxy) { - return findProxied(proxy, _wrappedIdentifier); - } - - private Object findProxied(final HibernateProxy proxy, final boolean asMap) + protected Object findProxied(final HibernateProxy proxy) { LazyInitializer init = proxy.getHibernateLazyInitializer(); if (!_forceLazyLoading && init.isUninitialized()) { if (_serializeIdentifier) { - String idName; - if (_mapping != null) { - idName = _mapping.getIdentifierPropertyName(init.getEntityName()); - } else { - final SessionImplementor session = init.getSession(); - if (session != null) { - idName = session.getFactory().getIdentifierPropertyName(init.getEntityName()); - } else { - idName = ProxyReader.getIdentifierPropertyName(init); - if (idName == null) { - idName = init.getEntityName(); - } - } - } final Object idValue = init.getIdentifier(); final Object result; - if (asMap) { - final HashMap map = new HashMap<>(); - map.put(idName, idValue); - result = map; + if (_wrappedIdentifier) { + final HashMap map = new HashMap<>(); + map.put(getIdentifierPropertyName(init), idValue); + result = map; } else { result = idValue; } @@ -234,11 +216,35 @@ private Object findProxied(final HibernateProxy proxy, final boolean asMap) } } + /** + * Helper method to retrieve the name of the identifier property of the + * specified lazy initializer. + * @param init Lazy initializer to obtain identifier property name from. + * @return Name of the identity property of the specified lazy initializer. + */ + private String getIdentifierPropertyName(final LazyInitializer init) { + String idName; + if (_mapping != null) { + idName = _mapping.getIdentifierPropertyName(init.getEntityName()); + } else { + final SessionImplementor session = init.getSession(); + if (session != null) { + idName = session.getFactory().getIdentifierPropertyName(init.getEntityName()); + } else { + idName = ProxyReader.getIdentifierPropertyName(init); + if (idName == null) { + idName = init.getEntityName(); + } + } + } + return idName; + } + /** * Inspects a Hibernate proxy to try and determine the name of the identifier property - * (Hibernate proxies know the getter of the identifier property because it receives special - * treatment in the invocation handler). Alas, the field storing the method reference is - * private and has no getter, so we must resort to ugly reflection hacks to read its value ... + * (Hibernate proxies know the getter of the identifier property because it receives special + * treatment in the invocation handler). Alas, the field storing the method reference is + * private and has no getter, so we must resort to ugly reflection hacks to read its value ... */ protected static class ProxyReader { From a2a9e19a177fdd146e6e5d4c95d59f061c66d73a Mon Sep 17 00:00:00 2001 From: jbosca Date: Wed, 1 Jul 2020 23:07:43 +0200 Subject: [PATCH 4/5] Added a new feature to disable wrapping of identifiers during proxy serialization, to Hibernate 5. --- .../datatype/hibernate5/Hibernate5Module.java | 9 ++- .../hibernate5/HibernateProxySerializer.java | 61 +++++++++++++------ .../hibernate5/HibernateSerializers.java | 4 +- 3 files changed, 54 insertions(+), 20 deletions(-) diff --git a/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/Hibernate5Module.java b/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/Hibernate5Module.java index 392b4f37..1a4b3f91 100644 --- a/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/Hibernate5Module.java +++ b/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/Hibernate5Module.java @@ -86,7 +86,14 @@ public enum Feature { * * @since 2.10 */ - WRITE_MISSING_ENTITIES_AS_NULL(false) + WRITE_MISSING_ENTITIES_AS_NULL(false), + + /** + * Feature that may be disables to unwrap the identifier + * of the serialized entity, returning a value instead of + * an object. + */ + WRAP_IDENTIFIER_IN_OBJECT(true) ; final boolean _defaultState; diff --git a/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/HibernateProxySerializer.java b/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/HibernateProxySerializer.java index 6245ad84..cb1fc6f7 100644 --- a/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/HibernateProxySerializer.java +++ b/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/HibernateProxySerializer.java @@ -47,6 +47,7 @@ public class HibernateProxySerializer protected final boolean _forceLazyLoading; protected final boolean _serializeIdentifier; protected final boolean _nullMissingEntities; + protected final boolean _wrappedIdentifier; protected final Mapping _mapping; /** @@ -63,26 +64,36 @@ public class HibernateProxySerializer public HibernateProxySerializer(boolean forceLazyLoading) { - this(forceLazyLoading, false, false, null, null); + this(forceLazyLoading, false, false, true, null, null); } public HibernateProxySerializer(boolean forceLazyLoading, boolean serializeIdentifier) { - this(forceLazyLoading, serializeIdentifier, false, null, null); + this(forceLazyLoading, serializeIdentifier, false, true, null, null); } public HibernateProxySerializer(boolean forceLazyLoading, boolean serializeIdentifier, Mapping mapping) { - this(forceLazyLoading, serializeIdentifier, false, mapping, null); + this(forceLazyLoading, serializeIdentifier, false, true, mapping, null); } public HibernateProxySerializer(boolean forceLazyLoading, boolean serializeIdentifier, boolean nullMissingEntities, Mapping mapping) { - this(forceLazyLoading, serializeIdentifier, nullMissingEntities, mapping, null); + this(forceLazyLoading, serializeIdentifier, nullMissingEntities, true, mapping, null); + } + + public HibernateProxySerializer(boolean forceLazyLoading, boolean serializeIdentifier, boolean nullMissingEntities, boolean wrappedIdentifier, Mapping mapping) { + this(forceLazyLoading, serializeIdentifier, nullMissingEntities, wrappedIdentifier, mapping, null); } public HibernateProxySerializer(boolean forceLazyLoading, boolean serializeIdentifier, boolean nullMissingEntities, Mapping mapping, BeanProperty property) { + this(forceLazyLoading, serializeIdentifier, nullMissingEntities, true, mapping, property); + } + + public HibernateProxySerializer(boolean forceLazyLoading, boolean serializeIdentifier, boolean nullMissingEntities, boolean wrappedIdentifier, Mapping mapping, + BeanProperty property) { _forceLazyLoading = forceLazyLoading; _serializeIdentifier = serializeIdentifier; _nullMissingEntities = nullMissingEntities; + _wrappedIdentifier = wrappedIdentifier; _mapping = mapping; _dynamicSerializers = PropertySerializerMap.emptyForProperties(); _property = property; @@ -187,22 +198,14 @@ protected Object findProxied(HibernateProxy proxy) LazyInitializer init = proxy.getHibernateLazyInitializer(); if (!_forceLazyLoading && init.isUninitialized()) { if (_serializeIdentifier) { - String idName; - if (_mapping != null) { - idName = _mapping.getIdentifierPropertyName(init.getEntityName()); + final Object idValue = init.getIdentifier(); + if (_wrappedIdentifier) { + HashMap map = new HashMap<>(); + map.put(getIdentifierPropertyName(init), idValue); + return map; } else { - idName = ProxySessionReader.getIdentifierPropertyName(init); - if (idName == null) { - idName = ProxyReader.getIdentifierPropertyName(init); - if (idName == null) { - idName = init.getEntityName(); - } - } + return idValue; } - final Object idValue = init.getIdentifier(); - HashMap map = new HashMap(); - map.put(idName, idValue); - return map; } return null; } @@ -216,6 +219,28 @@ protected Object findProxied(HibernateProxy proxy) } } } + + /** + * Helper method to retrieve the name of the identifier property of the + * specified lazy initializer. + * @param init Lazy initializer to obtain identifier property name from. + * @return Name of the identity property of the specified lazy initializer. + */ + private String getIdentifierPropertyName(final LazyInitializer init) { + String idName; + if (_mapping != null) { + idName = _mapping.getIdentifierPropertyName(init.getEntityName()); + } else { + idName = ProxySessionReader.getIdentifierPropertyName(init); + if (idName == null) { + idName = ProxyReader.getIdentifierPropertyName(init); + if (idName == null) { + idName = init.getEntityName(); + } + } + } + return idName; + } /** * Inspects a Hibernate proxy to try and determine the name of the identifier property diff --git a/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/HibernateSerializers.java b/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/HibernateSerializers.java index a89440a0..2669e55f 100644 --- a/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/HibernateSerializers.java +++ b/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/HibernateSerializers.java @@ -13,6 +13,7 @@ public class HibernateSerializers extends Serializers.Base protected final boolean _forceLoading; protected final boolean _serializeIdentifiers; protected final boolean _nullMissingEntities; + protected final boolean _wrappedIdentifier; protected final Mapping _mapping; public HibernateSerializers(int features) { @@ -24,6 +25,7 @@ public HibernateSerializers(Mapping mapping, int features) _forceLoading = Hibernate5Module.Feature.FORCE_LAZY_LOADING.enabledIn(features); _serializeIdentifiers = Hibernate5Module.Feature.SERIALIZE_IDENTIFIER_FOR_LAZY_NOT_LOADED_OBJECTS.enabledIn(features); _nullMissingEntities = Hibernate5Module.Feature.WRITE_MISSING_ENTITIES_AS_NULL.enabledIn(features); + _wrappedIdentifier = Hibernate5Module.Feature.WRAP_IDENTIFIER_IN_OBJECT.enabledIn(features); _mapping = mapping; } @@ -33,7 +35,7 @@ public JsonSerializer findSerializer(SerializationConfig config, { Class raw = type.getRawClass(); if (HibernateProxy.class.isAssignableFrom(raw)) { - return new HibernateProxySerializer(_forceLoading, _serializeIdentifiers, _nullMissingEntities, _mapping); + return new HibernateProxySerializer(_forceLoading, _serializeIdentifiers, _nullMissingEntities, _wrappedIdentifier, _mapping); } return null; } From 556f15cb93db1d80e0a2d05c02316541994a50df Mon Sep 17 00:00:00 2001 From: jbosca Date: Thu, 9 Jul 2020 08:56:33 +0200 Subject: [PATCH 5/5] Versioned new feaure 'since 2.12' --- .../fasterxml/jackson/datatype/hibernate4/Hibernate4Module.java | 2 ++ .../fasterxml/jackson/datatype/hibernate5/Hibernate5Module.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/Hibernate4Module.java b/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/Hibernate4Module.java index f87e0570..7225c007 100644 --- a/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/Hibernate4Module.java +++ b/hibernate4/src/main/java/com/fasterxml/jackson/datatype/hibernate4/Hibernate4Module.java @@ -92,6 +92,8 @@ public enum Feature { * Feature that may be disables to unwrap the identifier * of the serialized entity, returning a value instead of * an object. + * + * @since 2.12 */ WRAP_IDENTIFIER_IN_OBJECT(true); diff --git a/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/Hibernate5Module.java b/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/Hibernate5Module.java index 1a4b3f91..538990ce 100644 --- a/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/Hibernate5Module.java +++ b/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/Hibernate5Module.java @@ -92,6 +92,8 @@ public enum Feature { * Feature that may be disables to unwrap the identifier * of the serialized entity, returning a value instead of * an object. + * + * @since 2.12 */ WRAP_IDENTIFIER_IN_OBJECT(true) ;