diff --git a/extras/task-store-database-jpa/pom.xml b/extras/task-store-database-jpa/pom.xml
index 34a214ed4..503f66d48 100644
--- a/extras/task-store-database-jpa/pom.xml
+++ b/extras/task-store-database-jpa/pom.xml
@@ -107,5 +107,21 @@
quarkus-reactive-routes
test
+
+ io.quarkus
+ quarkus-jdbc-postgresql
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 3.1.0
+
+ io.a2a.extras.taskstore.database.jpa.DatabaseInitializer
+
+
+
+
\ No newline at end of file
diff --git a/extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/DatabaseInitializer.java b/extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/DatabaseInitializer.java
new file mode 100644
index 000000000..5354fcf0c
--- /dev/null
+++ b/extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/DatabaseInitializer.java
@@ -0,0 +1,71 @@
+package io.a2a.extras.taskstore.database.jpa;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.Statement;
+
+/**
+ * Utility class to initialize the database schema.
+ * This class handles:
+ * 1. Creation of 'a2a_tasks' table if it does not exist.
+ *
+ *
Configuration via Environment Variables:
+ *
+ * - {@code DB_URL}: JDBC URL (default: {@code jdbc:postgresql://localhost:5432/a2a_db})
+ * - {@code DB_USER}: Database User (default: {@code a2a})
+ * - {@code DB_PASSWORD}: Database Password (default: {@code a2a})
+ *
+ *
+ * @author Sandeep Belgavi
+ * @since 2026-02-17
+ */
+public class DatabaseInitializer {
+
+ private static final String JDBC_URL = System.getenv().getOrDefault("DB_URL", "jdbc:postgresql://localhost:5432/a2a_db");
+ private static final String USER = System.getenv().getOrDefault("DB_USER", "a2a");
+ private static final String PASS = System.getenv().getOrDefault("DB_PASSWORD", "a2a");
+
+ public static void main(String[] args) {
+ System.out.println("Starting Database Initialization...");
+ try {
+ // Load PostgreSQL driver explicitly
+ Class.forName("org.postgresql.Driver");
+
+ try (Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASS)) {
+ // 1. Create Table
+ createTable(conn);
+ }
+
+ System.out.println("Database Initialization Completed Successfully.");
+
+ } catch (ClassNotFoundException e) {
+ System.err.println("PostgreSQL Driver not found. Ensure 'org.postgresql:postgresql' is on the classpath.");
+ e.printStackTrace();
+ } catch (Exception e) {
+ System.err.println("Database Initialization Failed.");
+ e.printStackTrace();
+ }
+ }
+
+ private static void createTable(Connection conn) throws Exception {
+ String sql = "CREATE TABLE IF NOT EXISTS a2a_tasks (" +
+ "task_id VARCHAR(255) PRIMARY KEY, " +
+ "context_id VARCHAR(255), " +
+ "state VARCHAR(50), " +
+ "status_timestamp TIMESTAMP, " +
+ "finalized_at TIMESTAMP, " +
+ "task_data TEXT NOT NULL" +
+ ")";
+ try (Statement stmt = conn.createStatement()) {
+ stmt.execute(sql);
+ System.out.println("Verified table 'a2a_tasks'. Created if missing.");
+ }
+
+ // Also add index creation
+ String indexSql = "CREATE INDEX IF NOT EXISTS idx_a2a_tasks_context_id ON a2a_tasks(context_id)";
+ try (Statement stmt = conn.createStatement()) {
+ stmt.execute(indexSql);
+ System.out.println("Verified index 'idx_a2a_tasks_context_id'.");
+ }
+ }
+}
diff --git a/extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/JpaTask.java b/extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/JpaTask.java
index 021a693e3..58de27046 100644
--- a/extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/JpaTask.java
+++ b/extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/JpaTask.java
@@ -13,7 +13,9 @@
import io.a2a.spec.Task;
@Entity
-@Table(name = "a2a_tasks")
+@Table(name = "a2a_tasks", indexes = {
+ @jakarta.persistence.Index(name = "idx_a2a_tasks_context_id", columnList = "context_id")
+})
public class JpaTask {
@Id
@Column(name = "task_id")
@@ -22,7 +24,7 @@ public class JpaTask {
@Column(name = "context_id")
private String contextId;
- @Column(name = "state")
+ @Column(name = "state", length = 50)
private String state;
@Column(name = "status_timestamp")
diff --git a/extras/task-store-database-jpa/src/main/resources/schema.sql b/extras/task-store-database-jpa/src/main/resources/schema.sql
new file mode 100644
index 000000000..6adc5855b
--- /dev/null
+++ b/extras/task-store-database-jpa/src/main/resources/schema.sql
@@ -0,0 +1,16 @@
+-- Table Schema for A2A Task Store (Java Implementation)
+-- Matches io.a2a.extras.taskstore.database.jpa.JpaTask
+-- Author: Sandeep Belgavi
+-- Date: 2026-02-17
+
+CREATE TABLE IF NOT EXISTS a2a_tasks (
+ task_id VARCHAR(255) PRIMARY KEY,
+ context_id VARCHAR(255),
+ state VARCHAR(50),
+ status_timestamp TIMESTAMP,
+ finalized_at TIMESTAMP,
+ task_data TEXT NOT NULL
+);
+
+-- Optional: Create index on context_id for faster lookups
+CREATE INDEX IF NOT EXISTS idx_a2a_tasks_context_id ON a2a_tasks(context_id);