1717package org .springframework .boot .autoconfigure .orm .jpa ;
1818
1919import java .util .Arrays ;
20+ import java .util .Collection ;
2021import java .util .Collections ;
2122import java .util .LinkedHashMap ;
2223import java .util .List ;
4041import org .springframework .boot .autoconfigure .orm .jpa .HibernateJpaAutoConfiguration .HibernateEntityManagerCondition ;
4142import org .springframework .boot .autoconfigure .transaction .TransactionManagerCustomizers ;
4243import org .springframework .boot .jdbc .SchemaManagementProvider ;
44+ import org .springframework .boot .jdbc .metadata .DataSourcePoolMetadata ;
45+ import org .springframework .boot .jdbc .metadata .DataSourcePoolMetadataProvider ;
46+ import org .springframework .boot .jdbc .metadata .DataSourcePoolMetadataProviders ;
4347import org .springframework .boot .orm .jpa .hibernate .SpringJtaPlatform ;
4448import org .springframework .context .annotation .ConditionContext ;
4549import org .springframework .context .annotation .Conditional ;
@@ -73,6 +77,8 @@ public class HibernateJpaAutoConfiguration extends JpaBaseConfiguration {
7377
7478 private static final String JTA_PLATFORM = "hibernate.transaction.jta.platform" ;
7579
80+ private static final String PROVIDER_DISABLES_AUTOCOMMIT = "hibernate.connection.provider_disables_autocommit" ;
81+
7682 /**
7783 * {@code NoJtaPlatform} implementations for various Hibernate versions.
7884 */
@@ -89,16 +95,19 @@ public class HibernateJpaAutoConfiguration extends JpaBaseConfiguration {
8995 "org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform" , };
9096
9197 private final HibernateDefaultDdlAutoProvider defaultDdlAutoProvider ;
98+ private final Collection <DataSourcePoolMetadataProvider > metadataProviders ;
9299
93100 public HibernateJpaAutoConfiguration (DataSource dataSource ,
94101 JpaProperties jpaProperties ,
95102 ObjectProvider <JtaTransactionManager > jtaTransactionManager ,
96103 ObjectProvider <TransactionManagerCustomizers > transactionManagerCustomizers ,
104+ ObjectProvider <Collection <DataSourcePoolMetadataProvider >> metadataProviders ,
97105 ObjectProvider <List <SchemaManagementProvider >> providers ) {
98106 super (dataSource , jpaProperties , jtaTransactionManager ,
99107 transactionManagerCustomizers );
100108 this .defaultDdlAutoProvider = new HibernateDefaultDdlAutoProvider (
101109 providers .getIfAvailable (Collections ::emptyList ));
110+ this .metadataProviders = metadataProviders .getIfAvailable ();
102111 }
103112
104113 @ Override
@@ -121,6 +130,9 @@ protected void customizeVendorProperties(Map<String, Object> vendorProperties) {
121130 if (!vendorProperties .containsKey (JTA_PLATFORM )) {
122131 configureJtaPlatform (vendorProperties );
123132 }
133+ if (!vendorProperties .containsKey (PROVIDER_DISABLES_AUTOCOMMIT )) {
134+ configureProviderDisablesAutocommit (vendorProperties );
135+ }
124136 }
125137
126138 private void configureJtaPlatform (Map <String , Object > vendorProperties )
@@ -142,6 +154,18 @@ private void configureJtaPlatform(Map<String, Object> vendorProperties)
142154 }
143155 }
144156
157+ private void configureProviderDisablesAutocommit (Map <String , Object > vendorProperties ) {
158+ DataSourcePoolMetadataProvider poolMetadataProvider = new DataSourcePoolMetadataProviders (
159+ this .metadataProviders );
160+ DataSourcePoolMetadata poolMetadata = poolMetadataProvider
161+ .getDataSourcePoolMetadata (getDataSource ());
162+ if (poolMetadata != null
163+ && Boolean .FALSE .equals (poolMetadata .getDefaultAutoCommit ())
164+ && getJtaTransactionManager () == null ) {
165+ vendorProperties .put (PROVIDER_DISABLES_AUTOCOMMIT , "true" );
166+ }
167+ }
168+
145169 private boolean runningOnWebSphere () {
146170 return ClassUtils .isPresent (
147171 "com.ibm.websphere.jtaextensions." + "ExtendedJTATransaction" ,
0 commit comments