featureMethod) {
+ this.featureMethod = featureMethod;
+ }
+
+ void test(TestDatabaseFeatures features) {
+ featureMethod.accept(features);
+ }
+ }
+}
diff --git a/spring-data-jdbc/src/test/resources/logback.xml b/spring-data-jdbc/src/test/resources/logback.xml
index 5288df9b..67cda4af 100644
--- a/spring-data-jdbc/src/test/resources/logback.xml
+++ b/spring-data-jdbc/src/test/resources/logback.xml
@@ -7,8 +7,8 @@
-
-
+
+
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
new file mode 100644
index 00000000..65592859
--- /dev/null
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-oracle.sql
@@ -0,0 +1,327 @@
+DROP TABLE MANUAL CASCADE CONSTRAINTS PURGE;
+DROP TABLE LEGO_SET CASCADE CONSTRAINTS PURGE;
+DROP TABLE CHILD_NO_ID CASCADE CONSTRAINTS PURGE;
+DROP TABLE ONE_TO_ONE_PARENT CASCADE CONSTRAINTS PURGE;
+DROP TABLE ELEMENT_NO_ID CASCADE CONSTRAINTS PURGE;
+DROP TABLE LIST_PARENT CASCADE CONSTRAINTS PURGE;
+DROP TABLE BYTE_ARRAY_OWNER CASCADE CONSTRAINTS PURGE;
+DROP TABLE CHAIN0 CASCADE CONSTRAINTS PURGE;
+DROP TABLE CHAIN1 CASCADE CONSTRAINTS PURGE;
+DROP TABLE CHAIN2 CASCADE CONSTRAINTS PURGE;
+DROP TABLE CHAIN3 CASCADE CONSTRAINTS PURGE;
+DROP TABLE CHAIN4 CASCADE CONSTRAINTS PURGE;
+DROP TABLE NO_ID_CHAIN0 CASCADE CONSTRAINTS PURGE;
+DROP TABLE NO_ID_CHAIN1 CASCADE CONSTRAINTS PURGE;
+DROP TABLE NO_ID_CHAIN2 CASCADE CONSTRAINTS PURGE;
+DROP TABLE NO_ID_CHAIN3 CASCADE CONSTRAINTS PURGE;
+DROP TABLE NO_ID_CHAIN4 CASCADE CONSTRAINTS PURGE;
+DROP TABLE NO_ID_LIST_CHAIN0 CASCADE CONSTRAINTS PURGE;
+DROP TABLE NO_ID_LIST_CHAIN1 CASCADE CONSTRAINTS PURGE;
+DROP TABLE NO_ID_LIST_CHAIN2 CASCADE CONSTRAINTS PURGE;
+DROP TABLE NO_ID_LIST_CHAIN3 CASCADE CONSTRAINTS PURGE;
+DROP TABLE NO_ID_LIST_CHAIN4 CASCADE CONSTRAINTS PURGE;
+DROP TABLE NO_ID_MAP_CHAIN0 CASCADE CONSTRAINTS PURGE;
+DROP TABLE NO_ID_MAP_CHAIN1 CASCADE CONSTRAINTS PURGE;
+DROP TABLE NO_ID_MAP_CHAIN2 CASCADE CONSTRAINTS PURGE;
+DROP TABLE NO_ID_MAP_CHAIN3 CASCADE CONSTRAINTS PURGE;
+DROP TABLE NO_ID_MAP_CHAIN4 CASCADE CONSTRAINTS PURGE;
+DROP TABLE VERSIONED_AGGREGATE CASCADE CONSTRAINTS PURGE;
+DROP TABLE WITH_READ_ONLY CASCADE CONSTRAINTS PURGE;
+
+CREATE TABLE LEGO_SET
+(
+ "id1" NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ NAME VARCHAR(30)
+);
+CREATE TABLE MANUAL
+(
+ "id2" NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ LEGO_SET NUMBER,
+ ALTERNATIVE NUMBER,
+ CONTENT VARCHAR(2000)
+);
+
+ALTER TABLE MANUAL
+ ADD FOREIGN KEY (LEGO_SET)
+ REFERENCES LEGO_SET ("id1");
+
+CREATE TABLE ONE_TO_ONE_PARENT
+(
+ "id3" NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ content VARCHAR(30)
+);
+CREATE TABLE Child_No_Id
+(
+ ONE_TO_ONE_PARENT INTEGER PRIMARY KEY,
+ "content" VARCHAR(30)
+);
+
+CREATE TABLE LIST_PARENT
+(
+ "id4" NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ NAME VARCHAR(100)
+);
+CREATE TABLE element_no_id
+(
+ CONTENT VARCHAR(100),
+ LIST_PARENT_key NUMBER,
+ LIST_PARENT NUMBER
+);
+
+CREATE TABLE BYTE_ARRAY_OWNER
+(
+ ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ BINARY_DATA RAW(100) NOT NULL
+);
+
+CREATE TABLE CHAIN4
+(
+ FOUR NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ FOUR_VALUE VARCHAR(20)
+);
+
+
+CREATE TABLE CHAIN3
+(
+ THREE NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ THREE_VALUE VARCHAR(20),
+ CHAIN4 NUMBER,
+ FOREIGN KEY (CHAIN4) REFERENCES CHAIN4 (FOUR)
+);
+
+CREATE TABLE CHAIN2
+(
+ TWO NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ TWO_VALUE VARCHAR(20),
+ CHAIN3 NUMBER,
+ FOREIGN KEY (CHAIN3) REFERENCES CHAIN3 (THREE)
+);
+
+CREATE TABLE CHAIN1
+(
+ ONE NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ ONE_VALUE VARCHAR(20),
+ CHAIN2 NUMBER,
+ FOREIGN KEY (CHAIN2) REFERENCES CHAIN2 (TWO)
+);
+
+CREATE TABLE CHAIN0
+(
+ ZERO NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ ZERO_VALUE VARCHAR(20),
+ CHAIN1 NUMBER,
+ FOREIGN KEY (CHAIN1) REFERENCES CHAIN1 (ONE)
+);
+
+CREATE TABLE NO_ID_CHAIN4
+(
+ FOUR NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ FOUR_VALUE VARCHAR(20)
+);
+
+CREATE TABLE NO_ID_CHAIN3
+(
+ THREE_VALUE VARCHAR(20),
+ NO_ID_CHAIN4 NUMBER,
+ FOREIGN KEY (NO_ID_CHAIN4) REFERENCES NO_ID_CHAIN4 (FOUR)
+);
+
+CREATE TABLE NO_ID_CHAIN2
+(
+ TWO_VALUE VARCHAR(20),
+ NO_ID_CHAIN4 NUMBER,
+ FOREIGN KEY (NO_ID_CHAIN4) REFERENCES NO_ID_CHAIN4 (FOUR)
+);
+
+CREATE TABLE NO_ID_CHAIN1
+(
+ ONE_VALUE VARCHAR(20),
+ NO_ID_CHAIN4 NUMBER,
+ FOREIGN KEY (NO_ID_CHAIN4) REFERENCES NO_ID_CHAIN4 (FOUR)
+);
+
+CREATE TABLE NO_ID_CHAIN0
+(
+ ZERO_VALUE VARCHAR(20),
+ NO_ID_CHAIN4 NUMBER,
+ FOREIGN KEY (NO_ID_CHAIN4) REFERENCES NO_ID_CHAIN4 (FOUR)
+);
+
+CREATE TABLE NO_ID_LIST_CHAIN4
+(
+ FOUR NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ FOUR_VALUE VARCHAR(20)
+);
+
+CREATE TABLE NO_ID_LIST_CHAIN3
+(
+ THREE_VALUE VARCHAR(20),
+ NO_ID_LIST_CHAIN4 NUMBER,
+ NO_ID_LIST_CHAIN4_KEY NUMBER,
+ PRIMARY KEY (NO_ID_LIST_CHAIN4,
+ NO_ID_LIST_CHAIN4_KEY),
+ FOREIGN KEY (NO_ID_LIST_CHAIN4) REFERENCES NO_ID_LIST_CHAIN4 (FOUR)
+);
+
+CREATE TABLE NO_ID_LIST_CHAIN2
+(
+ TWO_VALUE VARCHAR(20),
+ NO_ID_LIST_CHAIN4 NUMBER,
+ NO_ID_LIST_CHAIN4_KEY NUMBER,
+ NO_ID_LIST_CHAIN3_KEY NUMBER,
+ PRIMARY KEY (NO_ID_LIST_CHAIN4,
+ NO_ID_LIST_CHAIN4_KEY,
+ NO_ID_LIST_CHAIN3_KEY),
+ FOREIGN KEY (
+ NO_ID_LIST_CHAIN4,
+ NO_ID_LIST_CHAIN4_KEY
+ ) REFERENCES NO_ID_LIST_CHAIN3 (
+ NO_ID_LIST_CHAIN4,
+ NO_ID_LIST_CHAIN4_KEY
+ )
+);
+
+CREATE TABLE NO_ID_LIST_CHAIN1
+(
+ ONE_VALUE VARCHAR(20),
+ NO_ID_LIST_CHAIN4 NUMBER,
+ NO_ID_LIST_CHAIN4_KEY NUMBER,
+ NO_ID_LIST_CHAIN3_KEY NUMBER,
+ NO_ID_LIST_CHAIN2_KEY NUMBER,
+ PRIMARY KEY (NO_ID_LIST_CHAIN4,
+ NO_ID_LIST_CHAIN4_KEY,
+ NO_ID_LIST_CHAIN3_KEY,
+ NO_ID_LIST_CHAIN2_KEY),
+ FOREIGN KEY (
+ NO_ID_LIST_CHAIN4,
+ NO_ID_LIST_CHAIN4_KEY,
+ NO_ID_LIST_CHAIN3_KEY
+ ) REFERENCES NO_ID_LIST_CHAIN2 (
+ NO_ID_LIST_CHAIN4,
+ NO_ID_LIST_CHAIN4_KEY,
+ NO_ID_LIST_CHAIN3_KEY
+ )
+);
+
+CREATE TABLE NO_ID_LIST_CHAIN0
+(
+ ZERO_VALUE VARCHAR(20),
+ NO_ID_LIST_CHAIN4 NUMBER,
+ NO_ID_LIST_CHAIN4_KEY NUMBER,
+ NO_ID_LIST_CHAIN3_KEY NUMBER,
+ NO_ID_LIST_CHAIN2_KEY NUMBER,
+ NO_ID_LIST_CHAIN1_KEY NUMBER,
+ PRIMARY KEY (NO_ID_LIST_CHAIN4,
+ NO_ID_LIST_CHAIN4_KEY,
+ NO_ID_LIST_CHAIN3_KEY,
+ NO_ID_LIST_CHAIN2_KEY,
+ NO_ID_LIST_CHAIN1_KEY),
+ FOREIGN KEY (
+ NO_ID_LIST_CHAIN4,
+ NO_ID_LIST_CHAIN4_KEY,
+ NO_ID_LIST_CHAIN3_KEY,
+ NO_ID_LIST_CHAIN2_KEY
+ ) REFERENCES NO_ID_LIST_CHAIN1 (
+ NO_ID_LIST_CHAIN4,
+ NO_ID_LIST_CHAIN4_KEY,
+ NO_ID_LIST_CHAIN3_KEY,
+ NO_ID_LIST_CHAIN2_KEY
+ )
+);
+
+
+
+CREATE TABLE NO_ID_MAP_CHAIN4
+(
+ FOUR NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ FOUR_VALUE VARCHAR(20)
+);
+
+CREATE TABLE NO_ID_MAP_CHAIN3
+(
+ THREE_VALUE VARCHAR(20),
+ NO_ID_MAP_CHAIN4 NUMBER,
+ NO_ID_MAP_CHAIN4_KEY VARCHAR(20),
+ PRIMARY KEY (NO_ID_MAP_CHAIN4,
+ NO_ID_MAP_CHAIN4_KEY),
+ FOREIGN KEY (NO_ID_MAP_CHAIN4) REFERENCES NO_ID_MAP_CHAIN4 (FOUR)
+);
+
+CREATE TABLE NO_ID_MAP_CHAIN2
+(
+ TWO_VALUE VARCHAR(20),
+ NO_ID_MAP_CHAIN4 NUMBER,
+ NO_ID_MAP_CHAIN4_KEY VARCHAR(20),
+ NO_ID_MAP_CHAIN3_KEY VARCHAR(20),
+ PRIMARY KEY (NO_ID_MAP_CHAIN4,
+ NO_ID_MAP_CHAIN4_KEY,
+ NO_ID_MAP_CHAIN3_KEY),
+ FOREIGN KEY (
+ NO_ID_MAP_CHAIN4,
+ NO_ID_MAP_CHAIN4_KEY
+ ) REFERENCES NO_ID_MAP_CHAIN3 (
+ NO_ID_MAP_CHAIN4,
+ NO_ID_MAP_CHAIN4_KEY
+ )
+);
+
+CREATE TABLE NO_ID_MAP_CHAIN1
+(
+ ONE_VALUE VARCHAR(20),
+ NO_ID_MAP_CHAIN4 NUMBER,
+ NO_ID_MAP_CHAIN4_KEY VARCHAR(20),
+ NO_ID_MAP_CHAIN3_KEY VARCHAR(20),
+ NO_ID_MAP_CHAIN2_KEY VARCHAR(20),
+ PRIMARY KEY (NO_ID_MAP_CHAIN4,
+ NO_ID_MAP_CHAIN4_KEY,
+ NO_ID_MAP_CHAIN3_KEY,
+ NO_ID_MAP_CHAIN2_KEY),
+ FOREIGN KEY (
+ NO_ID_MAP_CHAIN4,
+ NO_ID_MAP_CHAIN4_KEY,
+ NO_ID_MAP_CHAIN3_KEY
+ ) REFERENCES NO_ID_MAP_CHAIN2 (
+ NO_ID_MAP_CHAIN4,
+ NO_ID_MAP_CHAIN4_KEY,
+ NO_ID_MAP_CHAIN3_KEY
+ )
+);
+
+CREATE TABLE NO_ID_MAP_CHAIN0
+(
+ ZERO_VALUE VARCHAR(20),
+ NO_ID_MAP_CHAIN4 NUMBER,
+ NO_ID_MAP_CHAIN4_KEY VARCHAR(20),
+ NO_ID_MAP_CHAIN3_KEY VARCHAR(20),
+ NO_ID_MAP_CHAIN2_KEY VARCHAR(20),
+ NO_ID_MAP_CHAIN1_KEY VARCHAR(20),
+ PRIMARY KEY (NO_ID_MAP_CHAIN4,
+ NO_ID_MAP_CHAIN4_KEY,
+ NO_ID_MAP_CHAIN3_KEY,
+ NO_ID_MAP_CHAIN2_KEY,
+ NO_ID_MAP_CHAIN1_KEY),
+ FOREIGN KEY (
+ NO_ID_MAP_CHAIN4,
+ NO_ID_MAP_CHAIN4_KEY,
+ NO_ID_MAP_CHAIN3_KEY,
+ NO_ID_MAP_CHAIN2_KEY
+ ) REFERENCES NO_ID_MAP_CHAIN1 (
+ NO_ID_MAP_CHAIN4,
+ NO_ID_MAP_CHAIN4_KEY,
+ NO_ID_MAP_CHAIN3_KEY,
+ NO_ID_MAP_CHAIN2_KEY
+ )
+);
+
+CREATE TABLE VERSIONED_AGGREGATE
+(
+ ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ VERSION NUMBER
+);
+
+CREATE TABLE WITH_READ_ONLY
+(
+ ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ NAME VARCHAR(200),
+ READ_ONLY VARCHAR(200) DEFAULT 'from-db'
+);
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
new file mode 100644
index 00000000..b93ef418
--- /dev/null
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateSchemaIntegrationTests-oracle.sql
@@ -0,0 +1,18 @@
+DROP USER OTHER CASCADE;
+
+
+CREATE USER OTHER;
+
+CREATE TABLE OTHER.DUMMY_ENTITY
+(
+ ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ NAME VARCHAR2(30)
+);
+
+
+CREATE TABLE OTHER.REFERENCED
+(
+ DUMMY_ENTITY INTEGER,
+ NAME VARCHAR2(30)
+);
+
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository.config/EnableJdbcRepositoriesIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository.config/EnableJdbcRepositoriesIntegrationTests-oracle.sql
new file mode 100644
index 00000000..24f9f775
--- /dev/null
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository.config/EnableJdbcRepositoriesIntegrationTests-oracle.sql
@@ -0,0 +1,3 @@
+DROP TABLE DUMMY_ENTITY;
+
+CREATE TABLE DUMMY_ENTITY ( id NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY);
\ No newline at end of file
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryConcurrencyIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryConcurrencyIntegrationTests-oracle.sql
new file mode 100644
index 00000000..e6d9bfb0
--- /dev/null
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryConcurrencyIntegrationTests-oracle.sql
@@ -0,0 +1,14 @@
+DROP TABLE DUMMY_ENTITY CASCADE CONSTRAINTS PURGE;
+DROP TABLE ELEMENT CASCADE CONSTRAINTS PURGE;
+
+CREATE TABLE DUMMY_ENTITY (
+ ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
+ NAME VARCHAR2(100)
+);
+
+CREATE TABLE ELEMENT (
+ ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
+ CONTENT NUMBER,
+ DUMMY_ENTITY_KEY NUMBER ,
+ DUMMY_ENTITY NUMBER
+);
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-oracle.sql
new file mode 100644
index 00000000..1b02ef72
--- /dev/null
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-oracle.sql
@@ -0,0 +1,14 @@
+DROP TABLE ENTITY_WITH_STRINGY_BIG_DECIMAL CASCADE CONSTRAINTS PURGE;
+DROP TABLE OTHER_ENTITY CASCADE CONSTRAINTS PURGE;
+
+CREATE TABLE ENTITY_WITH_STRINGY_BIG_DECIMAL (
+ ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
+ STRINGY_NUMBER DECIMAL(20,10)
+);
+
+CREATE TABLE OTHER_ENTITY (
+ ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
+ CREATED DATE,
+ ENTITY_WITH_STRINGY_BIG_DECIMAL INTEGER
+);
+
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryEmbeddedImmutableIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryEmbeddedImmutableIntegrationTests-oracle.sql
new file mode 100644
index 00000000..1a27e7c6
--- /dev/null
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryEmbeddedImmutableIntegrationTests-oracle.sql
@@ -0,0 +1,7 @@
+DROP TABLE DUMMY_ENTITY CASCADE CONSTRAINTS PURGE;
+
+CREATE TABLE DUMMY_ENTITY (
+ ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
+ PREFIX_ATTR1 NUMBER,
+ PREFIX_ATTR2 VARCHAR2(100)
+);
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryEmbeddedIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryEmbeddedIntegrationTests-oracle.sql
new file mode 100644
index 00000000..4ad71309
--- /dev/null
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryEmbeddedIntegrationTests-oracle.sql
@@ -0,0 +1,9 @@
+DROP TABLE DUMMY_ENTITY CASCADE CONSTRAINTS PURGE;
+
+CREATE TABLE DUMMY_ENTITY (
+ ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
+ TEST VARCHAR2(100),
+ PREFIX2_ATTR NUMBER ,
+ PREFIX_TEST VARCHAR2(100),
+ PREFIX_PREFIX2_ATTR NUMBER
+);
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryEmbeddedNotInAggregateRootIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryEmbeddedNotInAggregateRootIntegrationTests-oracle.sql
new file mode 100644
index 00000000..0ab81989
--- /dev/null
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryEmbeddedNotInAggregateRootIntegrationTests-oracle.sql
@@ -0,0 +1,12 @@
+DROP TABLE DUMMY_ENTITY CASCADE CONSTRAINTS PURGE;
+DROP TABLE DUMMY_ENTITY2 CASCADE CONSTRAINTS PURGE;
+
+CREATE TABLE DUMMY_ENTITY (
+ ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
+ TEST VARCHAR2(100)
+);
+CREATE TABLE DUMMY_ENTITY2 (
+ ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
+ TEST VARCHAR2(100),
+ PREFIX_ATTR NUMBER
+);
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryEmbeddedWithCollectionIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryEmbeddedWithCollectionIntegrationTests-oracle.sql
new file mode 100644
index 00000000..66f369fc
--- /dev/null
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryEmbeddedWithCollectionIntegrationTests-oracle.sql
@@ -0,0 +1,17 @@
+DROP TABLE DUMMY_ENTITY2 CASCADE CONSTRAINTS PURGE;
+DROP TABLE DUMMY_ENTITY CASCADE CONSTRAINTS PURGE;
+
+CREATE TABLE DUMMY_ENTITY
+(
+ ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
+ TEST VARCHAR2(100),
+ PREFIX_TEST VARCHAR2(100)
+);
+
+CREATE TABLE DUMMY_ENTITY2
+(
+ ID NUMBER,
+ ORDER_KEY NUMBER,
+ TEST VARCHAR2(100),
+ PRIMARY KEY (ID, ORDER_KEY)
+)
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryEmbeddedWithReferenceIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryEmbeddedWithReferenceIntegrationTests-oracle.sql
new file mode 100644
index 00000000..40437415
--- /dev/null
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryEmbeddedWithReferenceIntegrationTests-oracle.sql
@@ -0,0 +1,16 @@
+DROP TABLE DUMMY_ENTITY2 CASCADE CONSTRAINTS PURGE;
+DROP TABLE DUMMY_ENTITY CASCADE CONSTRAINTS PURGE;
+
+
+
+CREATE TABLE dummy_entity
+(
+ ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ TEST VARCHAR2(100),
+ PREFIX_TEST VARCHAR2(100)
+);
+CREATE TABLE dummy_entity2
+(
+ ID NUMBER ,
+ TEST VARCHAR2(100)
+)
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryIdGenerationIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryIdGenerationIntegrationTests-oracle.sql
new file mode 100644
index 00000000..772fdfc1
--- /dev/null
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryIdGenerationIntegrationTests-oracle.sql
@@ -0,0 +1,18 @@
+DROP TABLE ReadOnlyIdEntity;
+DROP TABLE PrimitiveIdEntity;
+DROP TABLE ImmutableWithManualIdentity;
+
+CREATE TABLE ReadOnlyIdEntity (
+ ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ NAME VARCHAR2(100)
+);
+
+CREATE TABLE PrimitiveIdEntity (
+ ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ NAME VARCHAR2(100)
+);
+
+CREATE TABLE ImmutableWithManualIdentity (
+ ID NUMBER PRIMARY KEY,
+ NAME VARCHAR2(100)
+);
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryIntegrationTests-oracle.sql
new file mode 100644
index 00000000..28b2d80e
--- /dev/null
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryIntegrationTests-oracle.sql
@@ -0,0 +1,8 @@
+DROP TABLE DUMMY_ENTITY CASCADE CONSTRAINTS PURGE;
+
+CREATE TABLE DUMMY_ENTITY
+(
+ ID_PROP NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
+ NAME VARCHAR2(100),
+ POINT_IN_TIME TIMESTAMP
+);
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryPropertyConversionIntegrationTests-db2.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryPropertyConversionIntegrationTests-db2.sql
index 9ddb7fe3..dba16a76 100644
--- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryPropertyConversionIntegrationTests-db2.sql
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryPropertyConversionIntegrationTests-db2.sql
@@ -2,7 +2,8 @@ DROP TABLE ENTITY_WITH_COLUMNS_REQUIRING_CONVERSIONS;
CREATE TABLE ENTITY_WITH_COLUMNS_REQUIRING_CONVERSIONS (
id_Timestamp DATETIME NOT NULL PRIMARY KEY,
- bool boolean, SOME_ENUM VARCHAR(100),
+ bool boolean,
+ SOME_ENUM VARCHAR(100),
big_Decimal VARCHAR(100),
big_Integer BIGINT,
date DATETIME,
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryPropertyConversionIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryPropertyConversionIntegrationTests-oracle.sql
new file mode 100644
index 00000000..bfa63a53
--- /dev/null
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryPropertyConversionIntegrationTests-oracle.sql
@@ -0,0 +1,12 @@
+DROP TABLE ENTITY_WITH_COLUMNS_REQUIRING_CONVERSIONS;
+
+CREATE TABLE ENTITY_WITH_COLUMNS_REQUIRING_CONVERSIONS (
+ ID_TIMESTAMP TIMESTAMP PRIMARY KEY,
+ BOOL CHAR(1),
+ SOME_ENUM VARCHAR2(100),
+ BIG_DECIMAL DECIMAL (38),
+ BIG_INTEGER NUMBER(38, 0),
+ "DATE" TIMESTAMP,
+ LOCAL_DATE_TIME TIMESTAMP,
+ ZONED_DATE_TIME VARCHAR2(30)
+);
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryResultSetExtractorIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryResultSetExtractorIntegrationTests-oracle.sql
new file mode 100644
index 00000000..ab6fb458
--- /dev/null
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryResultSetExtractorIntegrationTests-oracle.sql
@@ -0,0 +1,14 @@
+DROP TABLE ADDRESS;
+DROP TABLE PERSON;
+
+CREATE TABLE PERSON (
+ ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ NAME VARCHAR2(100)
+);
+
+CREATE TABLE ADDRESS (
+ ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ STREET VARCHAR2(100),
+ PERSON_ID NUMBER);
+
+ALTER TABLE ADDRESS ADD FOREIGN KEY (PERSON_ID) REFERENCES PERSON(ID);
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryWithCollectionsIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryWithCollectionsIntegrationTests-oracle.sql
new file mode 100644
index 00000000..52dbc96a
--- /dev/null
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryWithCollectionsIntegrationTests-oracle.sql
@@ -0,0 +1,13 @@
+DROP TABLE ELEMENT;
+DROP TABLE DUMMY_ENTITY;
+
+CREATE TABLE DUMMY_ENTITY (
+ ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ NAME VARCHAR2(100)
+);
+
+CREATE TABLE ELEMENT (
+ ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ CONTENT VARCHAR(100),
+ DUMMY_ENTITY NUMBER
+);
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryWithListsIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryWithListsIntegrationTests-oracle.sql
new file mode 100644
index 00000000..47b21124
--- /dev/null
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryWithListsIntegrationTests-oracle.sql
@@ -0,0 +1,14 @@
+DROP TABLE ELEMENT;
+DROP TABLE DUMMY_ENTITY;
+
+CREATE TABLE DUMMY_ENTITY (
+ ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
+ NAME VARCHAR2(100)
+);
+
+CREATE TABLE ELEMENT (
+ ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
+ CONTENT VARCHAR(100),
+ DUMMY_ENTITY_KEY NUMBER,
+ DUMMY_ENTITY NUMBER
+);
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryWithMapsIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryWithMapsIntegrationTests-oracle.sql
new file mode 100644
index 00000000..6fb0e811
--- /dev/null
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryWithMapsIntegrationTests-oracle.sql
@@ -0,0 +1,17 @@
+DROP TABLE ELEMENT;
+DROP TABLE DUMMY_ENTITY;
+
+CREATE TABLE DUMMY_ENTITY (
+ ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ NAME VARCHAR2(100)
+);
+
+CREATE TABLE ELEMENT (
+ ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
+ CONTENT VARCHAR2(100),
+ DUMMY_ENTITY_KEY VARCHAR2(100),
+ DUMMY_ENTITY NUMBER );
+
+ALTER TABLE ELEMENT
+ ADD FOREIGN KEY (DUMMY_ENTITY)
+ REFERENCES DUMMY_ENTITY(ID);
diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/StringBasedJdbcQueryMappingConfigurationIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/StringBasedJdbcQueryMappingConfigurationIntegrationTests-oracle.sql
new file mode 100644
index 00000000..18c251e1
--- /dev/null
+++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/StringBasedJdbcQueryMappingConfigurationIntegrationTests-oracle.sql
@@ -0,0 +1,2 @@
+DROP TABLE CAR;
+CREATE TABLE CAR ( id NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY, model VARCHAR(100));
diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java
index aa1bad1a..e9182841 100644
--- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java
+++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java
@@ -81,4 +81,8 @@ public interface Dialect {
default Escaper getLikeEscaper() {
return Escaper.DEFAULT;
}
+
+ default IdGeneration getIdGeneration(){
+ return IdGeneration.DEFAULT;
+ };
}
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
new file mode 100644
index 00000000..19285ff3
--- /dev/null
+++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/IdGeneration.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2020 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
+ *
+ * https://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.data.relational.core.dialect;
+
+import java.sql.Connection;
+
+/**
+ * Describes the how obtaining generated ids after an insert works for a given JDBC driver.
+ *
+ * @author Jens Schauder
+ * @since 2.1
+ */
+public interface IdGeneration {
+ /**
+ * A default instance working for many databases and equivalent to Spring Data JDBCs behavior before version 2.1.
+ */
+ IdGeneration DEFAULT = new IdGeneration() {};
+
+ /**
+ * Does the driver require the specification of those columns for which a generated id shall be returned.
+ *
+ * This should be {@literal false} for most dialects. One notable exception is Oracle.
+ *
+ * @return {@literal true} if the a list of column names should get passed to the JDBC driver for which ids shall be
+ * generated.
+ *
+ * @see Connection#prepareStatement(String, String[])?
+ */
+ default boolean driverRequiresKeyColumnNames() {
+ return false;
+ }
+}
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
new file mode 100644
index 00000000..d1f23c3f
--- /dev/null
+++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/OracleDialect.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2019-2020 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
+ *
+ * https://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.data.relational.core.dialect;
+
+import java.util.List;
+
+import org.springframework.data.relational.core.sql.IdentifierProcessing;
+import org.springframework.data.relational.core.sql.LockOptions;
+import org.springframework.data.relational.core.sql.Table;
+import org.springframework.data.relational.core.sql.IdentifierProcessing.LetterCasing;
+import org.springframework.data.relational.core.sql.IdentifierProcessing.Quoting;
+import org.springframework.util.Assert;
+import org.springframework.util.ClassUtils;
+
+/**
+ * An SQL dialect for Oracle.
+ *
+ * @author Jens Schauder
+ * @since 2.1
+ */
+public class OracleDialect extends AnsiDialect {
+
+ /**
+ * Singleton instance.
+ */
+ public static final OracleDialect INSTANCE = new OracleDialect();
+
+ private static final IdGeneration ID_GENERATION = new IdGeneration() {
+ @Override
+ public boolean driverRequiresKeyColumnNames() {
+ return true;
+ }
+ };
+
+ protected OracleDialect() {}
+
+ @Override
+ public IdGeneration getIdGeneration() {
+ return ID_GENERATION;
+ }
+}