Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package org.springframework.boot.autoconfigure.orm.jpa;

import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
Expand All @@ -40,6 +41,9 @@
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.HibernateEntityManagerCondition;
import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers;
import org.springframework.boot.jdbc.SchemaManagementProvider;
import org.springframework.boot.jdbc.metadata.CompositeDataSourcePoolMetadataProvider;
import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadata;
import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProvider;
import org.springframework.boot.orm.jpa.hibernate.SpringJtaPlatform;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.context.annotation.Conditional;
Expand Down Expand Up @@ -73,6 +77,8 @@ public class HibernateJpaAutoConfiguration extends JpaBaseConfiguration {

private static final String JTA_PLATFORM = "hibernate.transaction.jta.platform";

private static final String PROVIDER_DISABLES_AUTOCOMMIT = "hibernate.connection.provider_disables_autocommit";

/**
* {@code NoJtaPlatform} implementations for various Hibernate versions.
*/
Expand All @@ -89,16 +95,19 @@ public class HibernateJpaAutoConfiguration extends JpaBaseConfiguration {
"org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform", };

private final HibernateDefaultDdlAutoProvider defaultDdlAutoProvider;
private final Collection<DataSourcePoolMetadataProvider> metadataProviders;

public HibernateJpaAutoConfiguration(DataSource dataSource,
JpaProperties jpaProperties,
ObjectProvider<JtaTransactionManager> jtaTransactionManager,
ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers,
ObjectProvider<Collection<DataSourcePoolMetadataProvider>> metadataProviders,
ObjectProvider<List<SchemaManagementProvider>> providers) {
super(dataSource, jpaProperties, jtaTransactionManager,
transactionManagerCustomizers);
this.defaultDdlAutoProvider = new HibernateDefaultDdlAutoProvider(
providers.getIfAvailable(Collections::emptyList));
this.metadataProviders = metadataProviders.getIfAvailable();
}

@Override
Expand All @@ -121,6 +130,9 @@ protected void customizeVendorProperties(Map<String, Object> vendorProperties) {
if (!vendorProperties.containsKey(JTA_PLATFORM)) {
configureJtaPlatform(vendorProperties);
}
if (!vendorProperties.containsKey(PROVIDER_DISABLES_AUTOCOMMIT)) {
configureProviderDisablesAutocommit(vendorProperties);
}
}

private void configureJtaPlatform(Map<String, Object> vendorProperties)
Expand All @@ -142,6 +154,18 @@ private void configureJtaPlatform(Map<String, Object> vendorProperties)
}
}

private void configureProviderDisablesAutocommit(Map<String, Object> vendorProperties) {
CompositeDataSourcePoolMetadataProvider poolMetadataProvider = new CompositeDataSourcePoolMetadataProvider(
this.metadataProviders);
DataSourcePoolMetadata poolMetadata = poolMetadataProvider
.getDataSourcePoolMetadata(getDataSource());
if (poolMetadata != null
&& Boolean.FALSE.equals(poolMetadata.getDefaultAutoCommit())
&& getJtaTransactionManager() == null) {
vendorProperties.put(PROVIDER_DISABLES_AUTOCOMMIT, "true");
}
}

private boolean runningOnWebSphere() {
return ClassUtils.isPresent(
"com.ibm.websphere.jtaextensions." + "ExtendedJTATransaction",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,9 @@ public String getValidationQuery() {
return getDataSource().getValidationQuery();
}

@Override
public Boolean getDefaultAutoCommit() {
return getDataSource().getDefaultAutoCommit();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,12 @@ public interface DataSourcePoolMetadata {
*/
String getValidationQuery();

/**
* The default auto-commit state of connections created by this pool.
* If not set ({@code null}), default is JDBC driver default
* (If set to null then the java.sql.Connection.setAutoCommit(boolean) method will not be called.)
* @return the default auto-commit state or {@code null}
*/
Boolean getDefaultAutoCommit();

}
Original file line number Diff line number Diff line change
Expand Up @@ -66,4 +66,9 @@ public String getValidationQuery() {
return getDataSource().getConnectionTestQuery();
}

@Override
public Boolean getDefaultAutoCommit() {
return getDataSource().isAutoCommit();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,9 @@ public String getValidationQuery() {
return getDataSource().getValidationQuery();
}

@Override
public Boolean getDefaultAutoCommit() {
return getDataSource().isDefaultAutoCommit();
}

}