From 775fbc39837c471c3ec19ff2efee3d798e37dc33 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 13 Nov 2025 14:59:22 +0000
Subject: [PATCH 1/4] Initial plan
From b880e0309f2e8b60ba84a58eb9904a55d432a4ee Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 13 Nov 2025 15:06:14 +0000
Subject: [PATCH 2/4] Update persistence dependencies: Hibernate 6.6.4 and
Jakarta Persistence API
Co-authored-by: jonesbusy <825750+jonesbusy@users.noreply.github.com>
---
pom.xml | 37 +++----------------
.../plugins/database/jpa/GlobalTable.java | 2 +-
.../database/jpa/PersistenceService.java | 2 +-
.../database/jpa/PersistenceUnitInfoImpl.java | 10 ++---
4 files changed, 13 insertions(+), 38 deletions(-)
diff --git a/pom.xml b/pom.xml
index 3b7bdb7..5c45357 100644
--- a/pom.xml
+++ b/pom.xml
@@ -42,25 +42,10 @@
- org.hibernate
- hibernate-entitymanager
- 5.6.15.Final
+ org.hibernate.orm
+ hibernate-core
+ 6.6.4.Final
-
-
- javax.activation
- javax.activation-api
-
-
-
- javax.xml.bind
- jaxb-api
-
-
-
- org.glassfish.jaxb
- jaxb-runtime
-
net.bytebuddy
@@ -69,25 +54,15 @@
-
- io.jenkins.plugins
- javax-activation-api
-
-
io.jenkins.plugins
byte-buddy-api
- io.jenkins.plugins
- jaxb
-
-
-
- javax.validation
- validation-api
- 2.0.1.Final
+ jakarta.validation
+ jakarta.validation-api
+ 3.1.0
org.hibernate.validator
diff --git a/src/main/java/org/jenkinsci/plugins/database/jpa/GlobalTable.java b/src/main/java/org/jenkinsci/plugins/database/jpa/GlobalTable.java
index 7ae12bd..59faa0f 100644
--- a/src/main/java/org/jenkinsci/plugins/database/jpa/GlobalTable.java
+++ b/src/main/java/org/jenkinsci/plugins/database/jpa/GlobalTable.java
@@ -3,7 +3,7 @@
import org.jenkinsci.plugins.database.GlobalDatabaseConfiguration;
import org.jvnet.hudson.annotation_indexer.Indexed;
-import javax.persistence.Entity;
+import jakarta.persistence.Entity;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
diff --git a/src/main/java/org/jenkinsci/plugins/database/jpa/PersistenceService.java b/src/main/java/org/jenkinsci/plugins/database/jpa/PersistenceService.java
index baa179b..536b8f4 100644
--- a/src/main/java/org/jenkinsci/plugins/database/jpa/PersistenceService.java
+++ b/src/main/java/org/jenkinsci/plugins/database/jpa/PersistenceService.java
@@ -9,7 +9,7 @@
import edu.umd.cs.findbugs.annotations.CheckForNull;
import jakarta.inject.Inject;
-import javax.persistence.EntityManagerFactory;
+import jakarta.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.SQLException;
diff --git a/src/main/java/org/jenkinsci/plugins/database/jpa/PersistenceUnitInfoImpl.java b/src/main/java/org/jenkinsci/plugins/database/jpa/PersistenceUnitInfoImpl.java
index 8797100..9397917 100644
--- a/src/main/java/org/jenkinsci/plugins/database/jpa/PersistenceUnitInfoImpl.java
+++ b/src/main/java/org/jenkinsci/plugins/database/jpa/PersistenceUnitInfoImpl.java
@@ -1,10 +1,10 @@
package org.jenkinsci.plugins.database.jpa;
-import javax.persistence.SharedCacheMode;
-import javax.persistence.ValidationMode;
-import javax.persistence.spi.ClassTransformer;
-import javax.persistence.spi.PersistenceUnitInfo;
-import javax.persistence.spi.PersistenceUnitTransactionType;
+import jakarta.persistence.SharedCacheMode;
+import jakarta.persistence.ValidationMode;
+import jakarta.persistence.spi.ClassTransformer;
+import jakarta.persistence.spi.PersistenceUnitInfo;
+import jakarta.persistence.spi.PersistenceUnitTransactionType;
import javax.sql.DataSource;
import java.net.URL;
import java.util.AbstractList;
From 6aed6ba3e09288e13779b8b983814e8e6ce8c477 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 13 Nov 2025 15:07:17 +0000
Subject: [PATCH 3/4] Update README with Jakarta Persistence imports
Co-authored-by: jonesbusy <825750+jonesbusy@users.noreply.github.com>
---
README.md | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 22435b4..331f1e9 100644
--- a/README.md
+++ b/README.md
@@ -69,8 +69,8 @@ to allow the user to select a database (see
### JPA support
-This plugin exposes it through [JPA 2.0
-API](https://en.wikipedia.org/wiki/Java_Persistence_API) (internally, it
+This plugin exposes it through [JPA
+API](https://en.wikipedia.org/wiki/Java_Persistence_API) using Jakarta Persistence (internally, it
uses Hibernate but please do not rely on this fact if you can as it may
change.) The entry point to the JPA support is the `PersistenceService`
class, and this exposes methods for obtaining `EntityManagerFactory` for
@@ -84,6 +84,11 @@ global database, please put `@GlobalTable` in addition to `@Entity`.
The following code shows how to use this to persiste a new row:
```java
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.Column;
+import jakarta.persistence.EntityManager;
+
public class Push {
@Inject
PersistenceService ps;
From 20ad5d8f21da87412bf0459d0639c6d8386b31f1 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 14 Nov 2025 10:23:42 +0000
Subject: [PATCH 4/4] Replace commons-dbcp2 with HikariCP for Jakarta
compatibility
Co-authored-by: jonesbusy <825750+jonesbusy@users.noreply.github.com>
---
pom.xml | 6 +-
.../plugins/database/BasicDataSource2.java | 84 +++++++++++++++++--
2 files changed, 80 insertions(+), 10 deletions(-)
diff --git a/pom.xml b/pom.xml
index 5c45357..e9491d6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -36,9 +36,9 @@
- org.apache.commons
- commons-dbcp2
- 2.13.0
+ com.zaxxer
+ HikariCP
+ 6.2.1
diff --git a/src/main/java/org/jenkinsci/plugins/database/BasicDataSource2.java b/src/main/java/org/jenkinsci/plugins/database/BasicDataSource2.java
index 7385046..2b0bca2 100644
--- a/src/main/java/org/jenkinsci/plugins/database/BasicDataSource2.java
+++ b/src/main/java/org/jenkinsci/plugins/database/BasicDataSource2.java
@@ -1,27 +1,97 @@
package org.jenkinsci.plugins.database;
-import org.apache.commons.dbcp2.BasicDataSource;
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;
import java.sql.Driver;
import java.sql.SQLException;
+import java.util.Properties;
/**
- * {@link BasicDataSource} with some convenience methods.
+ * HikariCP-based {@link DataSource} with convenience methods.
+ * Replaces the deprecated commons-dbcp2 BasicDataSource.
*
* @author Kohsuke Kawaguchi
*/
-public class BasicDataSource2 extends BasicDataSource {
+public class BasicDataSource2 {
+ private final HikariConfig config;
+
public BasicDataSource2() {
+ this.config = new HikariConfig();
+ // Set sensible defaults
+ config.setAutoCommit(true);
+ config.setConnectionTimeout(30000); // 30 seconds
+ config.setIdleTimeout(600000); // 10 minutes
+ config.setMaxLifetime(1800000); // 30 minutes
+ config.setMinimumIdle(1);
+ config.setMaximumPoolSize(10);
}
public void setDriverClass(Class extends Driver> driverClass) {
- setDriverClassName(driverClass.getName());
- setDriverClassLoader(driverClass.getClassLoader());
+ config.setDriverClassName(driverClass.getName());
+ }
+
+ public void setDriverClassName(String driverClassName) {
+ config.setDriverClassName(driverClassName);
+ }
+
+ public void setDriverClassLoader(ClassLoader classLoader) {
+ // HikariCP doesn't have direct setDriverClassLoader, but we can set it on the config
+ // The driver will be loaded by the current thread's context classloader
+ Thread.currentThread().setContextClassLoader(classLoader);
+ }
+
+ public void setUrl(String url) {
+ config.setJdbcUrl(url);
+ }
+
+ public void setUsername(String username) {
+ config.setUsername(username);
+ }
+
+ public void setPassword(String password) {
+ config.setPassword(password);
+ }
+
+ public void setValidationQuery(String validationQuery) {
+ if (validationQuery != null && !validationQuery.isEmpty()) {
+ config.setConnectionTestQuery(validationQuery);
+ }
+ }
+
+ public void addConnectionProperty(String name, String value) {
+ config.addDataSourceProperty(name, value);
+ }
+
+ public void setInitialSize(Integer initialSize) {
+ if (initialSize != null) {
+ config.setMinimumIdle(initialSize);
+ }
+ }
+
+ public void setMaxTotal(Integer maxTotal) {
+ if (maxTotal != null) {
+ config.setMaximumPoolSize(maxTotal);
+ }
+ }
+
+ public void setMaxIdle(Integer maxIdle) {
+ // HikariCP manages idle connections automatically
+ // We don't need to set this explicitly
+ }
+
+ public void setMinIdle(Integer minIdle) {
+ if (minIdle != null) {
+ config.setMinimumIdle(minIdle);
+ }
}
- @Override
public DataSource createDataSource() throws SQLException {
- return super.createDataSource();
+ try {
+ return new HikariDataSource(config);
+ } catch (Exception e) {
+ throw new SQLException("Failed to create HikariCP DataSource", e);
+ }
}
}