) c -> c.getMetaData().getDatabaseProductName().toLowerCase(Locale.ENGLISH));
- database = Arrays.stream(Database.values()).filter(db -> db.matches(productName)).findFirst().get();
+ database = Arrays.stream(Database.values()).filter(db -> db.matches(productName)).findFirst().orElseThrow();
}
/**
@@ -50,15 +50,6 @@ public class TestDatabaseFeatures {
assumeThat(database).isNotIn(Database.Oracle, Database.SqlServer);
}
- /**
- * Oracles JDBC driver seems to have a bug that makes it impossible to acquire generated keys when the column is
- * quoted. See
- * https://stackoverflow.com/questions/62263576/how-to-get-the-generated-key-for-a-column-with-lowercase-characters-from-oracle
- */
- private void supportsQuotedIds() {
- assumeThat(database).isNotEqualTo(Database.Oracle);
- }
-
/**
* Microsoft SqlServer does not allow explicitly setting ids in columns where the value gets generated by the
* database. Such columns therefore must not be used in referenced entities, since we do a delete and insert, which
@@ -115,7 +106,6 @@ public class TestDatabaseFeatures {
public enum Feature {
SUPPORTS_MULTIDIMENSIONAL_ARRAYS(TestDatabaseFeatures::supportsMultiDimensionalArrays), //
- SUPPORTS_QUOTED_IDS(TestDatabaseFeatures::supportsQuotedIds), //
SUPPORTS_HUGE_NUMBERS(TestDatabaseFeatures::supportsHugeNumbers), //
SUPPORTS_ARRAYS(TestDatabaseFeatures::supportsArrays), //
SUPPORTS_GENERATED_IDS_IN_REFERENCED_ENTITIES(TestDatabaseFeatures::supportsGeneratedIdsInReferencedEntities), //
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-oracle.sql
index 155a98b18..8155dc615 100644
--- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-oracle.sql
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-oracle.sql
@@ -43,7 +43,7 @@ CREATE TABLE MANUAL
(
"id2" NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
LEGO_SET NUMBER,
- ALTERNATIVE NUMBER,
+ "alternative" NUMBER,
CONTENT VARCHAR(2000)
);
@@ -59,7 +59,7 @@ CREATE TABLE ONE_TO_ONE_PARENT
CREATE TABLE Child_No_Id
(
ONE_TO_ONE_PARENT INTEGER PRIMARY KEY,
- "content" VARCHAR(30)
+ CONTENT VARCHAR(30)
);
CREATE TABLE LIST_PARENT
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateSchemaIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateSchemaIntegrationTests-oracle.sql
index b93ef418c..9e93e500f 100644
--- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateSchemaIntegrationTests-oracle.sql
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateSchemaIntegrationTests-oracle.sql
@@ -1,8 +1,9 @@
DROP USER OTHER CASCADE;
-
CREATE USER OTHER;
+ALTER USER OTHER QUOTA UNLIMITED ON USERS;
+
CREATE TABLE OTHER.DUMMY_ENTITY
(
ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/IdGeneration.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/IdGeneration.java
index 3b61ca25c..30cf7132f 100644
--- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/IdGeneration.java
+++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/IdGeneration.java
@@ -18,6 +18,8 @@ package org.springframework.data.relational.core.dialect;
import java.sql.Connection;
import java.sql.PreparedStatement;
+import org.springframework.data.relational.core.sql.SqlIdentifier;
+
/**
* Describes how obtaining generated ids after an insert works for a given JDBC driver.
*
@@ -45,6 +47,18 @@ public interface IdGeneration {
return false;
}
+ /**
+ * Provides for a given id {@link SqlIdentifier} the String that is to be used for registering interest in the
+ * generated value of that column.
+ *
+ * @param id {@link SqlIdentifier} representing a column for which a generated value is to be obtained.
+ * @return a String representing that column in the way expected by the JDBC driver.
+ * @since 3.3
+ */
+ default String getKeyColumnName(SqlIdentifier id) {
+ return id.getReference();
+ }
+
/**
* Does the driver support id generation for batch operations.
*
diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/OracleDialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/OracleDialect.java
index cb47d04f6..83c5cd055 100644
--- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/OracleDialect.java
+++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/OracleDialect.java
@@ -18,6 +18,7 @@ package org.springframework.data.relational.core.dialect;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter;
+import org.springframework.data.relational.core.sql.SqlIdentifier;
import java.util.Collection;
import java.util.Collections;
@@ -42,6 +43,11 @@ public class OracleDialect extends AnsiDialect {
public boolean driverRequiresKeyColumnNames() {
return true;
}
+
+ @Override
+ public String getKeyColumnName(SqlIdentifier id) {
+ return id.toSql(INSTANCE.getIdentifierProcessing());
+ }
};
protected OracleDialect() {}