From e5501e9e3faa990010e979067bee1cf4cbddc91b Mon Sep 17 00:00:00 2001 From: tangxin <617054137@qq.com> Date: Wed, 12 Feb 2025 17:25:00 +0800 Subject: [PATCH] =?UTF-8?q?fix:TenantFactory.withoutTenantCondition=20?= =?UTF-8?q?=E5=9C=A8=E4=BF=AE=E6=94=B9=E6=97=B6=20=E6=97=A0=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mybatisflex/core/table/TableInfo.java | 38 +++++++++++++++---- .../core/tenant/TenantManager.java | 9 ++++- .../com/mybatisflex/test/TenantTester.java | 18 +++++++++ 3 files changed, 55 insertions(+), 10 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java index cf232184..a157aa56 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java @@ -616,6 +616,7 @@ public class TableInfo { public Set obtainUpdateColumns(Object entity, boolean ignoreNulls, boolean includePrimary) { MetaObject metaObject = EntityMetaObject.forObject(entity, reflectorFactory); Set columns = new LinkedHashSet<>(); // 需使用 LinkedHashSet 保证 columns 的顺序 + boolean isIgnoreTenantCondition = TenantManager.isIgnoreTenantCondition(); if (entity instanceof UpdateWrapper) { Map updates = ((UpdateWrapper) entity).getUpdates(); if (updates.isEmpty()) { @@ -629,8 +630,13 @@ public class TableInfo { continue; } - // 过滤乐观锁字段 和 租户字段 - if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) { + // 忽略租户字段时 不要过滤租户字段 + if(isIgnoreTenantCondition){ + if (Objects.equals(column, versionColumn)) { + continue; + } + // 过滤乐观锁字段 和 租户字段 + }else if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) { continue; } @@ -654,8 +660,13 @@ public class TableInfo { continue; } - // 过滤乐观锁字段 和 租户字段 - if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) { + // 忽略租户字段时 不要过滤租户字段 + if(isIgnoreTenantCondition){ + if (Objects.equals(column, versionColumn)) { + continue; + } + // 过滤乐观锁字段 和 租户字段 + }else if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) { continue; } @@ -679,6 +690,7 @@ public class TableInfo { public Object[] buildUpdateSqlArgs(Object entity, boolean ignoreNulls, boolean includePrimary) { List values = new ArrayList<>(); + boolean isIgnoreTenantCondition = TenantManager.isIgnoreTenantCondition(); if (entity instanceof UpdateWrapper) { Map updates = ((UpdateWrapper) entity).getUpdates(); if (updates.isEmpty()) { @@ -691,8 +703,13 @@ public class TableInfo { if (onUpdateColumns != null && onUpdateColumns.containsKey(column)) { continue; } - // 过滤乐观锁字段 和 租户字段 - if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) { + // 忽略租户字段时 不要过滤租户字段 + if(isIgnoreTenantCondition){ + if (Objects.equals(column, versionColumn)) { + continue; + } + // 过滤乐观锁字段 和 租户字段 + }else if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) { continue; } @@ -739,8 +756,13 @@ public class TableInfo { continue; } - // 过滤乐观锁字段 和 租户字段 - if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) { + // 忽略租户字段时 不要过滤租户字段 + if(isIgnoreTenantCondition){ + if (Objects.equals(column, versionColumn)) { + continue; + } + // 过滤乐观锁字段 和 租户字段 + }else if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) { continue; } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/tenant/TenantManager.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/tenant/TenantManager.java index 95af3c92..45cbc3c2 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/tenant/TenantManager.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/tenant/TenantManager.java @@ -66,6 +66,12 @@ public class TenantManager { ignoreFlags.set(Boolean.TRUE); } + /** + * 是否忽略 tenant 条件 + */ + public static boolean isIgnoreTenantCondition() { + return Boolean.TRUE.equals(ignoreFlags.get()); + } /** * 恢复 tenant 条件 @@ -83,8 +89,7 @@ public class TenantManager { } public static Object[] getTenantIds(String tableName) { - Boolean ignoreFlag = ignoreFlags.get(); - if (ignoreFlag != null && ignoreFlag) { + if (isIgnoreTenantCondition()) { return null; } return tenantFactory != null ? tenantFactory.getTenantIds(tableName) : null; diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/TenantTester.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/TenantTester.java index 9eff4774..bfbf11d6 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/TenantTester.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/TenantTester.java @@ -24,6 +24,7 @@ import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import javax.sql.DataSource; +import java.util.Date; public class TenantTester { @@ -53,6 +54,23 @@ public class TenantTester { mapper.selectAll().forEach(System.out::println); + TenantAccount bean = new TenantAccount(); + bean.setTenantId(3L); + bean.setUserName("test"); + bean.setAge(10); + bean.setBirthday(new Date()); + bean.setId(102L); + + TenantManager.withoutTenantCondition(() -> mapper.insert(bean , true)); + bean.setTenantId(4L); + TenantManager.withoutTenantCondition(() -> mapper.update(bean , true)); + bean.setTenantId(4L); + mapper.update(bean , true); + TenantManager.setTenantFactory(() -> new Object[]{1, 2,4}); + mapper.selectAll().forEach(System.out::println); + TenantAccount tenantAccount = mapper.selectOneById(102L); + mapper.deleteById(102L); + assert tenantAccount.getTenantId() == 4; // mapper.selectListByQuery(QueryWrapper.create() // .select(TENANT_ACCOUNT.ALL_COLUMNS) // .from(TENANT_ACCOUNT.as("c"), ACCOUNT.as("b"))