From f3e6242568730593bb860080283ea6200fad2e5a Mon Sep 17 00:00:00 2001 From: Thomas Risberg Date: Fri, 29 May 2009 14:06:01 +0000 Subject: [PATCH] added override for supportsGetGeneratedKeys for Derby; driver reports this is unsupported, but it seems to work OK --- .../metadata/DerbyTableMetaDataProvider.java | 56 +++++++++++++++++++ .../PostgresTableMetaDataProvider.java | 4 +- .../TableMetaDataProviderFactory.java | 3 + 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/metadata/DerbyTableMetaDataProvider.java diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/metadata/DerbyTableMetaDataProvider.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/metadata/DerbyTableMetaDataProvider.java new file mode 100644 index 0000000000..dc3e213128 --- /dev/null +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/metadata/DerbyTableMetaDataProvider.java @@ -0,0 +1,56 @@ +/* + * Copyright 2002-2007 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.jdbc.core.metadata; + +import java.sql.DatabaseMetaData; +import java.sql.SQLException; + +/** + * The Derby specific implementation of the {@link org.springframework.jdbc.core.metadata.TableMetaDataProvider}. + * Overrides the Derby metadata info regarding retreiving generated keys. It seems to work OK so not sure why they + * claim it's not supported. + * + * @author Thomas Risberg + * @since 3.0 + */ +public class DerbyTableMetaDataProvider extends GenericTableMetaDataProvider { + + private boolean supportsGeneratedKeysOverride = false; + + public DerbyTableMetaDataProvider(DatabaseMetaData databaseMetaData) throws SQLException { + super(databaseMetaData); + } + + @Override + public void initializeWithMetaData(DatabaseMetaData databaseMetaData) throws SQLException { + super.initializeWithMetaData(databaseMetaData); + if (!databaseMetaData.supportsGetGeneratedKeys()) { + logger.warn("Overriding supportsGetGeneratedKeys from DatabaseMetaData to 'true'; it was reported as " + + "'false' by " + databaseMetaData.getDriverName() + " " + databaseMetaData.getDriverVersion()); + supportsGeneratedKeysOverride = true; + } + } + + @Override + public boolean isGetGeneratedKeysSupported() { + boolean derbysAnswer = super.isGetGeneratedKeysSupported(); + if (!derbysAnswer) { + return supportsGeneratedKeysOverride; + } + return derbysAnswer; + } +} \ No newline at end of file diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/metadata/PostgresTableMetaDataProvider.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/metadata/PostgresTableMetaDataProvider.java index 4bac90ae9d..85d097405e 100644 --- a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/metadata/PostgresTableMetaDataProvider.java +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/metadata/PostgresTableMetaDataProvider.java @@ -4,8 +4,8 @@ import java.sql.DatabaseMetaData; import java.sql.SQLException; /** - * The HSQL specific implementation of the {@link org.springframework.jdbc.core.metadata.TableMetaDataProvider}. Suports a feature for - * retreiving generated keys without the JDBC 3.0 getGeneratedKeys support. + * The PostgreSQL specific implementation of the {@link org.springframework.jdbc.core.metadata.TableMetaDataProvider}. + * Suports a feature for retreiving generated keys without the JDBC 3.0 getGeneratedKeys support. * * @author Thomas Risberg * @since 2.5 diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/metadata/TableMetaDataProviderFactory.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/metadata/TableMetaDataProviderFactory.java index 3084b3f97d..25bee2c8ef 100644 --- a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/metadata/TableMetaDataProviderFactory.java +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/metadata/TableMetaDataProviderFactory.java @@ -63,6 +63,9 @@ public class TableMetaDataProviderFactory { else if ("PostgreSQL".equals(databaseProductName)) { provider = new PostgresTableMetaDataProvider(databaseMetaData); } + else if ("Apache Derby".equals(databaseProductName)) { + provider = new DerbyTableMetaDataProvider(databaseMetaData); + } else { provider = new GenericTableMetaDataProvider(databaseMetaData); }