From 7adbdbf532e5ba258d675a50892d0d16971a4ac2 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Tue, 26 Mar 2024 22:45:39 +1300 Subject: [PATCH] feat: For SpringJdbcTransactionManager support using CurrentTenantProvider (#3368) Note that this only works for Multi-Tenant PARTITION mode where the TenantId is a column on the tables (rather than schema or database multi-tenancy mode). --- .../txn/SpringJdbcTransactionManager.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/ebean-spring-txn/src/main/java/io/ebean/spring/txn/SpringJdbcTransactionManager.java b/ebean-spring-txn/src/main/java/io/ebean/spring/txn/SpringJdbcTransactionManager.java index e51566b7a..a9f2fb475 100644 --- a/ebean-spring-txn/src/main/java/io/ebean/spring/txn/SpringJdbcTransactionManager.java +++ b/ebean-spring-txn/src/main/java/io/ebean/spring/txn/SpringJdbcTransactionManager.java @@ -2,6 +2,7 @@ package io.ebean.spring.txn; import io.avaje.applog.AppLog; import io.ebean.TxScope; +import io.ebean.config.CurrentTenantProvider; import io.ebean.config.ExternalTransactionManager; import io.ebeaninternal.api.SpiTransaction; import io.ebeaninternal.server.transaction.TransactionManager; @@ -27,13 +28,25 @@ public final class SpringJdbcTransactionManager implements ExternalTransactionMa private static final System.Logger log = AppLog.getLogger(SpringJdbcTransactionManager.class); + private final CurrentTenantProvider tenantProvider; + private DataSource dataSource; private TransactionManager transactionManager; + /** + * Instantiate with a CurrentTenantProvider for Multi-Tenant support. + *

+ * When a new transaction is detected, this will set the TenantId on that transaction. + */ + public SpringJdbcTransactionManager(CurrentTenantProvider tenantProvider) { + this.tenantProvider = tenantProvider; + } + /** * Instantiates a new spring aware transaction scope manager. */ public SpringJdbcTransactionManager() { + this.tenantProvider = null; } /** @@ -73,7 +86,13 @@ public final class SpringJdbcTransactionManager implements ExternalTransactionMa } else { // This is a new spring transaction that we have not seen before. // "wrap" it in a SpringJdbcTransaction for use with Ebean - SpringJdbcTransaction newTrans = new SpringJdbcTransaction(holder, transactionManager); + final var newTrans = new SpringJdbcTransaction(holder, transactionManager); + if (tenantProvider != null) { + final var tenantId = tenantProvider.currentId(); + if (tenantId != null) { + newTrans.setTenantId(tenantId); + } + } // Create and register a Spring TransactionSynchronization for this transaction springTxnLister = createListener(newTrans);