added a nativeJdbcExtractor property for the TableMetaDataProvider and a method to specify the one to use for SImpleJdbcInsert (SPR-7611)
This commit is contained in:
@@ -30,6 +30,7 @@ import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.dao.DataAccessResourceFailureException;
|
||||
import org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor;
|
||||
|
||||
/**
|
||||
* A generic implementation of the {@link TableMetaDataProvider} that should provide enough features for all supported
|
||||
@@ -71,6 +72,9 @@ public class GenericTableMetaDataProvider implements TableMetaDataProvider {
|
||||
/** Collection of TableParameterMetaData objects */
|
||||
private List<TableParameterMetaData> insertParameterMetaData = new ArrayList<TableParameterMetaData>();
|
||||
|
||||
/** NativeJdbcExtractor that can be used to retrieve the native connection */
|
||||
protected NativeJdbcExtractor nativeJdbcExtractor = null;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor used to initialize with provided database meta data.
|
||||
@@ -147,6 +151,9 @@ public class GenericTableMetaDataProvider implements TableMetaDataProvider {
|
||||
this.generatedKeysColumnNameArraySupported = generatedKeysColumnNameArraySupported;
|
||||
}
|
||||
|
||||
public void setNativeJdbcExtractor(NativeJdbcExtractor nativeJdbcExtractor) {
|
||||
this.nativeJdbcExtractor = nativeJdbcExtractor;
|
||||
}
|
||||
|
||||
public void initializeWithMetaData(DatabaseMetaData databaseMetaData) throws SQLException {
|
||||
|
||||
|
||||
@@ -49,7 +49,19 @@ public class OracleTableMetaDataProvider extends GenericTableMetaDataProvider {
|
||||
public void initializeWithTableColumnMetaData(DatabaseMetaData databaseMetaData,
|
||||
String catalogName, String schemaName, String tableName) throws SQLException {
|
||||
|
||||
Connection con = databaseMetaData.getConnection();
|
||||
Connection con = null;
|
||||
if (nativeJdbcExtractor == null) {
|
||||
con = databaseMetaData.getConnection();
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Using meta data JDBC connection: " + con.getClass().getName());
|
||||
}
|
||||
}
|
||||
else {
|
||||
con = nativeJdbcExtractor.getNativeConnection(databaseMetaData.getConnection());
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Using native JDBC connection: " + con.getClass().getName());
|
||||
}
|
||||
}
|
||||
Method methodToInvoke = null;
|
||||
Boolean origValueForIncludeSynonyms = null;
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ import org.springframework.jdbc.core.SqlTypeValue;
|
||||
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
|
||||
import org.springframework.jdbc.core.namedparam.SqlParameterSourceUtils;
|
||||
import org.springframework.jdbc.support.JdbcUtils;
|
||||
import org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor;
|
||||
|
||||
/**
|
||||
* Class to manage context metadata used for the configuration
|
||||
@@ -70,6 +71,9 @@ public class TableMetaDataContext {
|
||||
/** are we using generated key columns */
|
||||
private boolean generatedKeyColumnsUsed = false;
|
||||
|
||||
/** NativeJdbcExtractor to be used to retrieve the native connection */
|
||||
NativeJdbcExtractor nativeJdbcExtractor = null;
|
||||
|
||||
/**
|
||||
* Set the name of the table for this context.
|
||||
*/
|
||||
@@ -182,6 +186,13 @@ public class TableMetaDataContext {
|
||||
return this.metaDataProvider.isGeneratedKeysColumnNameArraySupported();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set {@link NativeJdbcExtractor} to be used to retrieve the native connection
|
||||
*/
|
||||
public void setNativeJdbcExtractor(NativeJdbcExtractor nativeJdbcExtractor) {
|
||||
this.nativeJdbcExtractor = nativeJdbcExtractor;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Process the current meta data with the provided configuration options
|
||||
@@ -190,7 +201,7 @@ public class TableMetaDataContext {
|
||||
* @param generatedKeyNames name of generated keys
|
||||
*/
|
||||
public void processMetaData(DataSource dataSource, List<String> declaredColumns, String[] generatedKeyNames) {
|
||||
this.metaDataProvider = TableMetaDataProviderFactory.createMetaDataProvider(dataSource, this);
|
||||
this.metaDataProvider = TableMetaDataProviderFactory.createMetaDataProvider(dataSource, this, this.nativeJdbcExtractor);
|
||||
this.tableColumns = reconcileColumnsToUse(declaredColumns, generatedKeyNames);
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,8 @@ import java.sql.DatabaseMetaData;
|
||||
import java.sql.SQLException;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor;
|
||||
|
||||
/**
|
||||
* Interface specifying the API to be implemented by a class providing table metedata. This is intended for internal use
|
||||
* by the Simple JDBC classes.
|
||||
@@ -127,4 +129,8 @@ public interface TableMetaDataProvider {
|
||||
*/
|
||||
List<TableParameterMetaData> getTableParameterMetaData();
|
||||
|
||||
/**
|
||||
* Set the {@link NativeJdbcExtractor} to use to retrieve the native connection if necessary
|
||||
*/
|
||||
void setNativeJdbcExtractor(NativeJdbcExtractor nativeJdbcExtractor);
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ import org.springframework.dao.DataAccessResourceFailureException;
|
||||
import org.springframework.jdbc.support.DatabaseMetaDataCallback;
|
||||
import org.springframework.jdbc.support.JdbcUtils;
|
||||
import org.springframework.jdbc.support.MetaDataAccessException;
|
||||
import org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor;
|
||||
|
||||
/**
|
||||
* Factory used to create a {@link TableMetaDataProvider} implementation based on the type of databse being used.
|
||||
@@ -48,6 +49,19 @@ public class TableMetaDataProviderFactory {
|
||||
*/
|
||||
static public TableMetaDataProvider createMetaDataProvider(DataSource dataSource,
|
||||
final TableMetaDataContext context) {
|
||||
return createMetaDataProvider(dataSource, context, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a TableMetaDataProvider based on the database metedata
|
||||
* @param dataSource used to retrieve metedata
|
||||
* @param context the class that holds configuration and metedata
|
||||
* @param nativeJdbcExtractor @{link NativeJdbcExtractor} to be used
|
||||
* @return instance of the TableMetaDataProvider implementation to be used
|
||||
*/
|
||||
static public TableMetaDataProvider createMetaDataProvider(DataSource dataSource,
|
||||
final TableMetaDataContext context,
|
||||
final NativeJdbcExtractor nativeJdbcExtractor) {
|
||||
try {
|
||||
return (TableMetaDataProvider) JdbcUtils.extractDatabaseMetaData(
|
||||
dataSource, new DatabaseMetaDataCallback() {
|
||||
@@ -74,6 +88,9 @@ public class TableMetaDataProviderFactory {
|
||||
else {
|
||||
provider = new GenericTableMetaDataProvider(databaseMetaData);
|
||||
}
|
||||
if (nativeJdbcExtractor != null) {
|
||||
provider.setNativeJdbcExtractor(nativeJdbcExtractor);
|
||||
}
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Using " + provider.getClass().getName());
|
||||
}
|
||||
|
||||
@@ -48,6 +48,7 @@ import org.springframework.jdbc.core.namedparam.SqlParameterSource;
|
||||
import org.springframework.jdbc.support.GeneratedKeyHolder;
|
||||
import org.springframework.jdbc.support.JdbcUtils;
|
||||
import org.springframework.jdbc.support.KeyHolder;
|
||||
import org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
@@ -227,6 +228,13 @@ public abstract class AbstractJdbcInsert {
|
||||
return jdbcTemplate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the {@link NativeJdbcExtractor} to use to retrieve the native connection if necessary
|
||||
*/
|
||||
public void setNativeJdbcExtractor(NativeJdbcExtractor nativeJdbcExtractor) {
|
||||
this.tableMetaDataContext.setNativeJdbcExtractor(nativeJdbcExtractor);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
// Methods handling compilation issues
|
||||
|
||||
@@ -24,6 +24,7 @@ import javax.sql.DataSource;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
|
||||
import org.springframework.jdbc.support.KeyHolder;
|
||||
import org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor;
|
||||
|
||||
/**
|
||||
* A SimpleJdbcInsert is a multi-threaded, reusable object providing easy insert
|
||||
@@ -104,6 +105,11 @@ public class SimpleJdbcInsert extends AbstractJdbcInsert implements SimpleJdbcIn
|
||||
return this;
|
||||
}
|
||||
|
||||
public SimpleJdbcInsertOperations useNativeJdbcExtractorForMetaData(NativeJdbcExtractor nativeJdbcExtractor) {
|
||||
setNativeJdbcExtractor(nativeJdbcExtractor);
|
||||
return this;
|
||||
}
|
||||
|
||||
public int execute(Map<String, Object> args) {
|
||||
return doExecute(args);
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ import java.util.Map;
|
||||
|
||||
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
|
||||
import org.springframework.jdbc.support.KeyHolder;
|
||||
import org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor;
|
||||
|
||||
/**
|
||||
* Interface specifying the API for a Simple JDBC Insert implemented by {@link SimpleJdbcInsert}.
|
||||
@@ -81,6 +82,16 @@ public interface SimpleJdbcInsertOperations {
|
||||
*/
|
||||
SimpleJdbcInsertOperations includeSynonymsForTableColumnMetaData();
|
||||
|
||||
/**
|
||||
* Use a the provided NativeJdbcExtractor during the column meta data
|
||||
* lookups via JDBC.
|
||||
* Note: this is only necessary to include when running with a connection pool
|
||||
* that wraps the meta data connection and when using a database like Oracle
|
||||
* where it is necessary to access the native connection to include synonyms.
|
||||
* @return the instance of this SimpleJdbcInsert
|
||||
*/
|
||||
SimpleJdbcInsertOperations useNativeJdbcExtractorForMetaData(NativeJdbcExtractor nativeJdbcExtractor);
|
||||
|
||||
|
||||
/**
|
||||
* Execute the insert using the values passed in.
|
||||
|
||||
Reference in New Issue
Block a user