From 7a042062f59deb596e9208ecafebd4a08139dbf0 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 13 Jul 2022 18:07:12 +0200 Subject: [PATCH] Compatibility with Hibernate 6.0/6.1 (for transitional purposes) Closes gh-28813 --- .../hibernate5/HibernateTransactionManager.java | 16 ++++++++++------ .../hibernate5/SpringSessionSynchronization.java | 12 +++++++++--- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateTransactionManager.java b/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateTransactionManager.java index 8d0001c5741..c064c98160b 100644 --- a/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateTransactionManager.java +++ b/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateTransactionManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -497,7 +497,7 @@ public class HibernateTransactionManager extends AbstractPlatformTransactionMana if (logger.isDebugEnabled()) { logger.debug("Preparing JDBC Connection of Hibernate Session [" + session + "]"); } - Connection con = session.connection(); + Connection con = session.getJdbcCoordinator().getLogicalConnection().getPhysicalConnection(); Integer previousIsolationLevel = DataSourceUtils.prepareConnectionForTransaction(con, definition); txObject.setPreviousIsolationLevel(previousIsolationLevel); txObject.setReadOnly(definition.isReadOnly()); @@ -562,7 +562,9 @@ public class HibernateTransactionManager extends AbstractPlatformTransactionMana // Register the Hibernate Session's JDBC Connection for the DataSource, if set. if (getDataSource() != null) { - ConnectionHolder conHolder = new ConnectionHolder(session::connection); + final SessionImplementor sessionToUse = session; + ConnectionHolder conHolder = new ConnectionHolder( + () -> sessionToUse.getJdbcCoordinator().getLogicalConnection().getPhysicalConnection()); if (timeout != TransactionDefinition.TIMEOUT_DEFAULT) { conHolder.setTimeoutInSeconds(timeout); } @@ -724,7 +726,7 @@ public class HibernateTransactionManager extends AbstractPlatformTransactionMana // the isolation level and/or read-only flag of the JDBC Connection here. // Else, we need to rely on the connection pool to perform proper cleanup. try { - Connection con = session.connection(); + Connection con = session.getJdbcCoordinator().getLogicalConnection().getPhysicalConnection(); Integer previousHoldability = txObject.getPreviousHoldability(); if (previousHoldability != null) { con.setHoldability(previousHoldability); @@ -763,13 +765,15 @@ public class HibernateTransactionManager extends AbstractPlatformTransactionMana /** * Disconnect a pre-existing Hibernate Session on transaction completion, * returning its database connection but preserving its entity state. - *

The default implementation simply calls {@link Session#disconnect()}. + *

The default implementation calls the equivalent of {@link Session#disconnect()}. * Subclasses may override this with a no-op or with fine-tuned disconnection logic. * @param session the Hibernate Session to disconnect * @see Session#disconnect() */ protected void disconnectOnCompletion(Session session) { - session.disconnect(); + if (session instanceof SessionImplementor sessionImpl) { + sessionImpl.getJdbcCoordinator().getLogicalConnection().manualDisconnect(); + } } /** diff --git a/spring-orm/src/main/java/org/springframework/orm/hibernate5/SpringSessionSynchronization.java b/spring-orm/src/main/java/org/springframework/orm/hibernate5/SpringSessionSynchronization.java index 896a7986554..1b06ecad25e 100644 --- a/spring-orm/src/main/java/org/springframework/orm/hibernate5/SpringSessionSynchronization.java +++ b/spring-orm/src/main/java/org/springframework/orm/hibernate5/SpringSessionSynchronization.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ package org.springframework.orm.hibernate5; import org.hibernate.FlushMode; import org.hibernate.Session; import org.hibernate.SessionFactory; +import org.hibernate.engine.spi.SessionImplementor; import org.springframework.core.Ordered; import org.springframework.dao.DataAccessException; @@ -69,7 +70,10 @@ public class SpringSessionSynchronization implements TransactionSynchronization, if (this.holderActive) { TransactionSynchronizationManager.unbindResource(this.sessionFactory); // Eagerly disconnect the Session here, to make release mode "on_close" work on JBoss. - getCurrentSession().disconnect(); + Session session = getCurrentSession(); + if (session instanceof SessionImplementor sessionImpl) { + sessionImpl.getJdbcCoordinator().getLogicalConnection().manualDisconnect(); + } } } @@ -106,7 +110,9 @@ public class SpringSessionSynchronization implements TransactionSynchronization, session.setHibernateFlushMode(this.sessionHolder.getPreviousFlushMode()); } // Eagerly disconnect the Session here, to make release mode "on_close" work nicely. - session.disconnect(); + if (session instanceof SessionImplementor sessionImpl) { + sessionImpl.getJdbcCoordinator().getLogicalConnection().manualDisconnect(); + } } finally { // Unbind at this point if it's a new Session...