From b7f92b2b8e366ae4d7df47d1391f420850b8c39f Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Wed, 9 Jul 2025 23:09:10 +0100 Subject: [PATCH 1/2] update hibernate 6 code to avoid deprecated code --- .../hibernate6/Hibernate6ProxySerializer.java | 47 +++---------------- .../PersistentCollectionSerializer.java | 4 +- 2 files changed, 9 insertions(+), 42 deletions(-) diff --git a/hibernate6/src/main/java/com/fasterxml/jackson/datatype/hibernate6/Hibernate6ProxySerializer.java b/hibernate6/src/main/java/com/fasterxml/jackson/datatype/hibernate6/Hibernate6ProxySerializer.java index 8c2cb0de..4f63e996 100644 --- a/hibernate6/src/main/java/com/fasterxml/jackson/datatype/hibernate6/Hibernate6ProxySerializer.java +++ b/hibernate6/src/main/java/com/fasterxml/jackson/datatype/hibernate6/Hibernate6ProxySerializer.java @@ -8,7 +8,7 @@ import org.hibernate.engine.spi.Mapping; import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.engine.spi.SessionImplementor; +import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.proxy.HibernateProxy; import org.hibernate.proxy.LazyInitializer; import org.hibernate.proxy.pojo.BasicLazyInitializer; @@ -249,6 +249,7 @@ private String getIdentifierPropertyName(final LazyInitializer init) { if (_mapping != null) { idName = _mapping.getIdentifierPropertyName(init.getEntityName()); } else { + // no unit tests rely on this next call and Hibernate 7 does not support it idName = ProxySessionReader.getIdentifierPropertyName(init); if (idName == null) { idName = ProxyReader.getIdentifierPropertyName(init); @@ -301,47 +302,13 @@ static String getIdentifierPropertyName(LazyInitializer init) { } } - /** - * Hibernate 5.2 broke abi compatibility of org.hibernate.proxy.LazyInitializer.getSession() - * The api contract changed - * from org.hibernate.proxy.LazyInitializer.getSession()Lorg.hibernate.engine.spi.SessionImplementor; - * to org.hibernate.proxy.LazyInitializer.getSession()Lorg.hibernate.engine.spi.SharedSessionContractImplementor - * - * On hibernate 5.2 the interface SessionImplementor extends SharedSessionContractImplementor. - * And an instance of org.hibernate.internal.SessionImpl is returned from getSession(). - */ protected static class ProxySessionReader { - - /** - * The getSession method must be executed using reflection for compatibility purpose. - * For efficiency keep the method cached. - */ - protected static final Method lazyInitializerGetSessionMethod; - - static { - try { - lazyInitializerGetSessionMethod = LazyInitializer.class.getMethod("getSession"); - } catch (Exception e) { - // should never happen: the class and method exists in all versions of hibernate 5 - throw new RuntimeException(e); - } - } - + static String getIdentifierPropertyName(LazyInitializer init) { - final Object session; - try{ - session = lazyInitializerGetSessionMethod.invoke(init); - } catch (Exception e) { - // Should never happen - throw new RuntimeException(e); - } - if(session instanceof SessionImplementor){ - SessionFactoryImplementor factory = ((SessionImplementor)session).getFactory(); - return factory.getIdentifierPropertyName(init.getEntityName()); - }else if (session != null) { - // Should never happen: session should be an instance of org.hibernate.internal.SessionImpl - // factory = session.getClass().getMethod("getFactory").invoke(session); - throw new RuntimeException("Session is not instance of SessionImplementor"); + final SharedSessionContractImplementor session = init.getSession(); + if (session != null) { + SessionFactoryImplementor factory = session.getFactory(); + return factory.getIdentifierPropertyName(init.getEntityName()); } return null; } diff --git a/hibernate6/src/main/java/com/fasterxml/jackson/datatype/hibernate6/PersistentCollectionSerializer.java b/hibernate6/src/main/java/com/fasterxml/jackson/datatype/hibernate6/PersistentCollectionSerializer.java index 1fd54aa8..5c142b9d 100644 --- a/hibernate6/src/main/java/com/fasterxml/jackson/datatype/hibernate6/PersistentCollectionSerializer.java +++ b/hibernate6/src/main/java/com/fasterxml/jackson/datatype/hibernate6/PersistentCollectionSerializer.java @@ -307,8 +307,8 @@ private Session openTemporarySessionForLoading(PersistentCollection coll) { session.setHibernateFlushMode(FlushMode.MANUAL); persistenceContext.addUninitializedDetachedCollection( - ((SessionFactoryImplementor) _sessionFactory).getMetamodel().collectionPersister(coll.getRole()), - coll + ((SessionFactoryImplementor) _sessionFactory).getMappingMetamodel().getCollectionDescriptor(coll.getRole()), + coll ); return session; From f0362f127480db594ae3deea8baed7d1a7e22fb7 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Wed, 9 Jul 2025 15:19:58 -0700 Subject: [PATCH 2/2] Update release notes --- release-notes/VERSION | 2 ++ 1 file changed, 2 insertions(+) diff --git a/release-notes/VERSION b/release-notes/VERSION index 70e9438a..35cab426 100644 --- a/release-notes/VERSION +++ b/release-notes/VERSION @@ -6,6 +6,8 @@ Project: jackson-datatype-hibernate 2.20.0 (not yet released) +#186: Update hibernate 6 code to avoid deprecated code + (fixed by @pjfanning) - Generate SBOMs [JSTEP-14] 2.19.1 (13-Jun-2025)