From e29a4f63aae8f13a39e273e520d530f0785f7fbd Mon Sep 17 00:00:00 2001
From: fanxt0218 <3515228784@qq.com>
Date: Thu, 19 Jun 2025 12:10:05 +0800
Subject: [PATCH 1/9] Oracle: add OracleChatMemory support
Signed-off-by: fanxt0218 <3515228784@qq.com>
---
.../jdbc/JdbcChatMemoryRepositoryDialect.java | 3 ++
.../OracleChatMemoryRepositoryDialect.java | 47 +++++++++++++++++++
2 files changed, 50 insertions(+)
create mode 100644 memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java
diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java
index 526c0908c77..6de842bd01d 100644
--- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java
+++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java
@@ -71,6 +71,9 @@ static JdbcChatMemoryRepositoryDialect from(DataSource dataSource) {
if (url.contains("hsqldb")) {
return new HsqldbChatMemoryRepositoryDialect();
}
+ if (url.contains("oracle")) {
+ return new OracleChatMemoryRepositoryDialect();
+ }
// Add more as needed
}
catch (Exception ignored) {
diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java
new file mode 100644
index 00000000000..657d863eb73
--- /dev/null
+++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2024-2025 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.ai.chat.memory.repository.jdbc;
+
+/**
+ * Dialect for Oracle.
+ *
+ * @author Xiaotong Fan
+ * @since 1.1.0
+ */
+
+public class OracleChatMemoryRepositoryDialect implements JdbcChatMemoryRepositoryDialect {
+ @Override
+ public String getSelectMessagesSql() {
+ return "SELECT content, type FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ? ORDER BY \"timestamp\"";
+ }
+
+ @Override
+ public String getInsertMessageSql() {
+ return "INSERT INTO SPRING_AI_CHAT_MEMORY (conversation_id, content, type, \"timestamp\") VALUES (?, ?, ?, ?)";
+ }
+
+ @Override
+ public String getSelectConversationIdsSql() {
+ return "SELECT DISTINCT conversation_id FROM SPRING_AI_CHAT_MEMORY";
+ }
+
+ @Override
+ public String getDeleteMessagesSql() {
+ return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ?";
+ }
+
+}
From 5b62ffe17658ce9d9dfa42dd72b58b132c348a01 Mon Sep 17 00:00:00 2001
From: fanxt0218 <3515228784@qq.com>
Date: Fri, 20 Jun 2025 14:32:25 +0800
Subject: [PATCH 2/9] add Oracle schema and corresponding integration test
Signed-off-by: fanxt0218 <3515228784@qq.com>
---
.../pom.xml | 16 +++++++++
.../memory/repository/jdbc/schema-oracle.sql | 9 +++++
.../JdbcChatMemoryRepositoryBuilderTests.java | 18 ++++++++++
.../JdbcChatMemoryRepositoryOracleIT.java | 34 +++++++++++++++++++
4 files changed, 77 insertions(+)
create mode 100644 memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/resources/org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql
create mode 100644 memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java
diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml
index 75db46a8e1a..8b57633f92e 100644
--- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml
+++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml
@@ -88,6 +88,14 @@
true
+
+
+ com.oracle.database.jdbc
+ ojdbc8
+ 21.13.0.0
+ test
+
+
org.springframework.boot
spring-boot-starter-test
@@ -100,6 +108,14 @@
test
+
+
+ org.testcontainers
+ oracle-xe
+ 1.19.0
+ test
+
+
org.testcontainers
postgresql
diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/resources/org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/resources/org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql
new file mode 100644
index 00000000000..d245ea65b48
--- /dev/null
+++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/resources/org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql
@@ -0,0 +1,9 @@
+CREATE TABLE SPRING_AI_CHAT_MEMORY (
+ conversation_id VARCHAR2(36) NOT NULL,
+ content CLOB NOT NULL,
+ type VARCHAR2(10) NOT NULL CHECK (type IN ('USER', 'ASSISTANT', 'SYSTEM', 'TOOL')),
+ "timestamp" TIMESTAMP NOT NULL
+);
+
+CREATE INDEX idx_conversation_id ON SPRING_AI_CHAT_MEMORY(conversation_id);
+CREATE INDEX idx_conversation_id_timestamp ON SPRING_AI_CHAT_MEMORY(conversation_id, "timestamp");
\ No newline at end of file
diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryBuilderTests.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryBuilderTests.java
index 87dbfa5f03b..80f6a97f156 100644
--- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryBuilderTests.java
+++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryBuilderTests.java
@@ -37,6 +37,7 @@
*
* @author Mark Pollack
* @author Yanming Zhou
+ * @author Xiaotong Fan
*/
public class JdbcChatMemoryRepositoryBuilderTests {
@@ -136,6 +137,23 @@ void testBuilderWithHsqldbDialectFromDataSource() throws SQLException {
assertThat(repository).isNotNull();
}
+ @Test
+ void testBuilderWithOracleDialectFromDataSource() throws SQLException {
+ // Setup mocks for Oracle
+ DataSource dataSource = mock(DataSource.class);
+ Connection connection = mock(Connection.class);
+ DatabaseMetaData metaData = mock(DatabaseMetaData.class);
+
+ when(dataSource.getConnection()).thenReturn(connection);
+ when(connection.getMetaData()).thenReturn(metaData);
+ when(metaData.getURL()).thenReturn("jdbc:oracle:thin:@//192.168.19.129:1521/ORCL");
+
+ // Test with dialect from datasource
+ JdbcChatMemoryRepository repository = JdbcChatMemoryRepository.builder().dataSource(dataSource).build();
+
+ assertThat(repository).isNotNull();
+ }
+
@Test
void testBuilderWithUnknownDialectFromDataSource() throws SQLException {
// Setup mocks for unknown database
diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java
new file mode 100644
index 00000000000..a2db77b3eda
--- /dev/null
+++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2023-2025 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.ai.chat.memory.repository.jdbc;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.jdbc.Sql;
+
+/**
+ * Integration tests for {@link JdbcChatMemoryRepository} with Oracle.
+ *
+ * @author Xiaotong Fan
+ */
+
+@SpringBootTest
+@TestPropertySource(properties = {"spring.datasource.url=jdbc:tc:oracle:21.3.0.0:///"})
+@Sql(scripts = "classpath:org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql")
+public class JdbcChatMemoryRepositoryOracleIT extends AbstractJdbcChatMemoryRepositoryIT{
+
+}
From b1026d994929608ea55df6acdf0960c016882327 Mon Sep 17 00:00:00 2001
From: fanxt0218 <3515228784@qq.com>
Date: Fri, 20 Jun 2025 21:03:46 +0800
Subject: [PATCH 3/9] add the extendedMethod define
Signed-off-by: fanxt0218 <3515228784@qq.com>
---
.../jdbc/OracleChatMemoryRepositoryDialect.java | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java
index 657d863eb73..210a8d03c0a 100644
--- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java
+++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java
@@ -44,4 +44,12 @@ public String getDeleteMessagesSql() {
return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ?";
}
+ /**
+ * This method requires uncommenting the Override annotation after the interface defines the method
+ */
+ //@Override
+ public String getDeleteAllMessageSql() {
+ return "DELETE FROM SPRING_AI_CHAT_MEMORY";
+ }
+
}
From beaf0477b8d062648f87ddc2da26ecb20ccebb5c Mon Sep 17 00:00:00 2001
From: fanxt0218 <3515228784@qq.com>
Date: Sat, 21 Jun 2025 11:41:17 +0800
Subject: [PATCH 4/9] fix the error: javaformat error(run
spring-javaformat:apply)
Signed-off-by: fanxt0218 <3515228784@qq.com>
---
.../repository/jdbc/OracleChatMemoryRepositoryDialect.java | 6 ++++--
.../repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java | 4 ++--
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java
index 210a8d03c0a..71708c21d63 100644
--- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java
+++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java
@@ -24,6 +24,7 @@
*/
public class OracleChatMemoryRepositoryDialect implements JdbcChatMemoryRepositoryDialect {
+
@Override
public String getSelectMessagesSql() {
return "SELECT content, type FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ? ORDER BY \"timestamp\"";
@@ -45,9 +46,10 @@ public String getDeleteMessagesSql() {
}
/**
- * This method requires uncommenting the Override annotation after the interface defines the method
+ * This method requires uncommenting the Override annotation after the interface
+ * defines the method
*/
- //@Override
+ // @Override
public String getDeleteAllMessageSql() {
return "DELETE FROM SPRING_AI_CHAT_MEMORY";
}
diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java
index a2db77b3eda..7ed889c7430 100644
--- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java
+++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java
@@ -27,8 +27,8 @@
*/
@SpringBootTest
-@TestPropertySource(properties = {"spring.datasource.url=jdbc:tc:oracle:21.3.0.0:///"})
+@TestPropertySource(properties = { "spring.datasource.url=jdbc:tc:oracle:21.3.0.0:///" })
@Sql(scripts = "classpath:org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql")
-public class JdbcChatMemoryRepositoryOracleIT extends AbstractJdbcChatMemoryRepositoryIT{
+public class JdbcChatMemoryRepositoryOracleIT extends AbstractJdbcChatMemoryRepositoryIT {
}
From c92337360e6dd5519d61d296de7d6f1cd752c630 Mon Sep 17 00:00:00 2001
From: fanxt0218 <3515228784@qq.com>
Date: Sat, 25 Oct 2025 13:10:16 +0800
Subject: [PATCH 5/9] Adapt JdbcRepos Dialect
Signed-off-by: fanxt0218 <3515228784@qq.com>
---
.../jdbc/JdbcChatMemoryRepositoryDialect.java | 23 +------------------
1 file changed, 1 insertion(+), 22 deletions(-)
diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java
index b3a860d5295..3e4cb6737e6 100644
--- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java
+++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java
@@ -61,28 +61,6 @@ public interface JdbcChatMemoryRepositoryDialect {
* Detects the dialect from the DataSource.
*/
static JdbcChatMemoryRepositoryDialect from(DataSource dataSource) {
- // Simple detection (could be improved)
- try (Connection connection = dataSource.getConnection()) {
- String url = connection.getMetaData().getURL().toLowerCase();
- if (url.contains("postgresql")) {
- return new PostgresChatMemoryRepositoryDialect();
- }
- if (url.contains("mysql")) {
- return new MysqlChatMemoryRepositoryDialect();
- }
- if (url.contains("mariadb")) {
- return new MysqlChatMemoryRepositoryDialect();
- }
- if (url.contains("sqlserver")) {
- return new SqlServerChatMemoryRepositoryDialect();
- }
- if (url.contains("hsqldb")) {
- return new HsqldbChatMemoryRepositoryDialect();
- }
- if (url.contains("oracle")) {
- return new OracleChatMemoryRepositoryDialect();
- }
- // Add more as needed
String productName = null;
try {
productName = JdbcUtils.extractDatabaseMetaData(dataSource, DatabaseMetaData::getDatabaseProductName);
@@ -100,6 +78,7 @@ static JdbcChatMemoryRepositoryDialect from(DataSource dataSource) {
case "MySQL", "MariaDB" -> new MysqlChatMemoryRepositoryDialect();
case "Microsoft SQL Server" -> new SqlServerChatMemoryRepositoryDialect();
case "HSQL Database Engine" -> new HsqldbChatMemoryRepositoryDialect();
+ case "Oracle" -> new OracleChatMemoryRepositoryDialect();
default -> // Add more as needed
new PostgresChatMemoryRepositoryDialect();
};
From 801a5febcd3f671c984ff57bdced75b26b0ed25c Mon Sep 17 00:00:00 2001
From: fanxt0218 <3515228784@qq.com>
Date: Sat, 25 Oct 2025 13:11:30 +0800
Subject: [PATCH 6/9] remove empty doc
Signed-off-by: fanxt0218 <3515228784@qq.com>
---
.../repository/jdbc/JdbcChatMemoryRepositoryDialect.java | 4 ----
1 file changed, 4 deletions(-)
diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java
index 3e4cb6737e6..aa9a44da6a9 100644
--- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java
+++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java
@@ -53,10 +53,6 @@ public interface JdbcChatMemoryRepositoryDialect {
*/
String getDeleteMessagesSql();
- /**
- * Optionally, dialect can provide more advanced SQL as needed.
- */
-
/**
* Detects the dialect from the DataSource.
*/
From 529bb2059cf3ba2bec36668d6fa6954f05ad2236 Mon Sep 17 00:00:00 2001
From: fanxt0218 <3515228784@qq.com>
Date: Sun, 26 Oct 2025 23:19:58 +0800
Subject: [PATCH 7/9] update chat-memory.adoc(Add the flag for Oracle support)
Signed-off-by: fanxt0218 <3515228784@qq.com>
---
.../src/main/antora/modules/ROOT/pages/api/chat-memory.adoc | 1 +
1 file changed, 1 insertion(+)
diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat-memory.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat-memory.adoc
index 4231a2dbcb6..18b28a15969 100644
--- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat-memory.adoc
+++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat-memory.adoc
@@ -128,6 +128,7 @@ Spring AI supports multiple relational databases via a dialect abstraction. The
- MySQL / MariaDB
- SQL Server
- HSQLDB
+- Oracle Database
The correct dialect can be auto-detected from the JDBC URL when using `JdbcChatMemoryRepositoryDialect.from(DataSource)`. You can extend support for other databases by implementing the `JdbcChatMemoryRepositoryDialect` interface.
From 4a0ebe9af580856c950e705daa18a448b4a8f0a3 Mon Sep 17 00:00:00 2001
From: psilberk
Date: Sun, 26 Oct 2025 22:11:55 -0700
Subject: [PATCH 8/9] Adding Oracle Dialect
Signed-off-by: psilberk
---
.../pom.xml | 14 +++++------
.../OracleChatMemoryRepositoryDialect.java | 6 ++---
.../memory/repository/jdbc/schema-oracle.sql | 24 ++++++++++++++-----
.../JdbcChatMemoryRepositoryOracleIT.java | 3 ++-
4 files changed, 30 insertions(+), 17 deletions(-)
diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml
index 31fb946f59b..150ad214a4e 100644
--- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml
+++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml
@@ -50,13 +50,7 @@
spring-jdbc
-
- com.zaxxer
- HikariCP
-
-
-
org.postgresql
postgresql
@@ -89,7 +83,13 @@
com.oracle.database.jdbc
ojdbc8
- 21.13.0.0
+ 23.9.0.25.07
+ test
+
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
test
diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java
index 71708c21d63..32416d5fb23 100644
--- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java
+++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java
@@ -27,12 +27,12 @@ public class OracleChatMemoryRepositoryDialect implements JdbcChatMemoryReposito
@Override
public String getSelectMessagesSql() {
- return "SELECT content, type FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ? ORDER BY \"timestamp\"";
+ return "SELECT content, type FROM SPRING_AI_CHAT_MEMORY WHERE CONVERSATION_ID = ? ORDER BY \"TIMESTAMP\"";
}
@Override
public String getInsertMessageSql() {
- return "INSERT INTO SPRING_AI_CHAT_MEMORY (conversation_id, content, type, \"timestamp\") VALUES (?, ?, ?, ?)";
+ return "INSERT INTO SPRING_AI_CHAT_MEMORY (CONVERSATION_ID, CONTENT, TYPE, \"TIMESTAMP\") VALUES (?, ?, ?, ?)";
}
@Override
@@ -42,7 +42,7 @@ public String getSelectConversationIdsSql() {
@Override
public String getDeleteMessagesSql() {
- return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ?";
+ return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE CONVERSATION_ID = ?";
}
/**
diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/resources/org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/resources/org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql
index d245ea65b48..47a411299b5 100644
--- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/resources/org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql
+++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/resources/org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql
@@ -1,9 +1,21 @@
+DROP TABLE SPRING_AI_CHAT_MEMORY;
+
CREATE TABLE SPRING_AI_CHAT_MEMORY (
- conversation_id VARCHAR2(36) NOT NULL,
- content CLOB NOT NULL,
- type VARCHAR2(10) NOT NULL CHECK (type IN ('USER', 'ASSISTANT', 'SYSTEM', 'TOOL')),
- "timestamp" TIMESTAMP NOT NULL
+ CONVERSATION_ID VARCHAR2(36 CHAR) NOT NULL,
+ CONTENT CLOB NOT NULL,
+ "TYPE" VARCHAR2(10 CHAR) NOT NULL CHECK (
+ "TYPE" IN (
+ 'USER',
+ 'ASSISTANT',
+ 'SYSTEM',
+ 'TOOL'
+ )
+ ),
+ "TIMESTAMP" TIMESTAMP NOT NULL
);
-CREATE INDEX idx_conversation_id ON SPRING_AI_CHAT_MEMORY(conversation_id);
-CREATE INDEX idx_conversation_id_timestamp ON SPRING_AI_CHAT_MEMORY(conversation_id, "timestamp");
\ No newline at end of file
+CREATE INDEX SPRING_AI_CHAT_MEMORY_CONVERSATION_ID_TIMESTAMP_IDX
+ ON SPRING_AI_CHAT_MEMORY(
+ CONVERSATION_ID,
+ 'TIMESTAMP'
+ );
\ No newline at end of file
diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java
index 7ed889c7430..511967d9ee8 100644
--- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java
+++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java
@@ -27,7 +27,8 @@
*/
@SpringBootTest
-@TestPropertySource(properties = { "spring.datasource.url=jdbc:tc:oracle:21.3.0.0:///" })
+@TestPropertySource(properties = { "spring.datasource.url=jdbc:oracle:thin:@localhost:1521/FREEPDB1",
+ "spring.datasource.username=scott", "spring.datasource.password=tiger" })
@Sql(scripts = "classpath:org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql")
public class JdbcChatMemoryRepositoryOracleIT extends AbstractJdbcChatMemoryRepositoryIT {
From 07fd54f636f7e2703a6db797463bee2becef5eb4 Mon Sep 17 00:00:00 2001
From: fanxt0218 <3515228784@qq.com>
Date: Tue, 28 Oct 2025 21:53:44 +0800
Subject: [PATCH 9/9] remove deprecated method
Signed-off-by: fanxt0218 <3515228784@qq.com>
---
.../spring-ai-model-chat-memory-repository-jdbc/pom.xml | 2 +-
.../jdbc/OracleChatMemoryRepositoryDialect.java | 9 ---------
2 files changed, 1 insertion(+), 10 deletions(-)
diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml
index f6fefb32b57..38d51b12103 100644
--- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml
+++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml
@@ -82,7 +82,7 @@
com.oracle.database.jdbc
- ojdbc8
+ ojdbc11
23.9.0.25.07
test
diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java
index 32416d5fb23..a3784509c6e 100644
--- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java
+++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java
@@ -45,13 +45,4 @@ public String getDeleteMessagesSql() {
return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE CONVERSATION_ID = ?";
}
- /**
- * This method requires uncommenting the Override annotation after the interface
- * defines the method
- */
- // @Override
- public String getDeleteAllMessageSql() {
- return "DELETE FROM SPRING_AI_CHAT_MEMORY";
- }
-
}