fix:TenantFactory.withoutTenantCondition 在修改时 无效

This commit is contained in:
tangxin 2025-02-12 17:25:00 +08:00
parent 0c4b0c2266
commit e5501e9e3f
3 changed files with 55 additions and 10 deletions

View File

@ -616,6 +616,7 @@ public class TableInfo {
public Set<String> obtainUpdateColumns(Object entity, boolean ignoreNulls, boolean includePrimary) {
MetaObject metaObject = EntityMetaObject.forObject(entity, reflectorFactory);
Set<String> columns = new LinkedHashSet<>(); // 需使用 LinkedHashSet 保证 columns 的顺序
boolean isIgnoreTenantCondition = TenantManager.isIgnoreTenantCondition();
if (entity instanceof UpdateWrapper) {
Map<String, Object> updates = ((UpdateWrapper) entity).getUpdates();
if (updates.isEmpty()) {
@ -629,8 +630,13 @@ public class TableInfo {
continue;
}
// 忽略租户字段时 不要过滤租户字段
if(isIgnoreTenantCondition){
if (Objects.equals(column, versionColumn)) {
continue;
}
// 过滤乐观锁字段 租户字段
if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) {
}else if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) {
continue;
}
@ -654,8 +660,13 @@ public class TableInfo {
continue;
}
// 忽略租户字段时 不要过滤租户字段
if(isIgnoreTenantCondition){
if (Objects.equals(column, versionColumn)) {
continue;
}
// 过滤乐观锁字段 租户字段
if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) {
}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<Object> values = new ArrayList<>();
boolean isIgnoreTenantCondition = TenantManager.isIgnoreTenantCondition();
if (entity instanceof UpdateWrapper) {
Map<String, Object> updates = ((UpdateWrapper) entity).getUpdates();
if (updates.isEmpty()) {
@ -691,8 +703,13 @@ public class TableInfo {
if (onUpdateColumns != null && onUpdateColumns.containsKey(column)) {
continue;
}
// 忽略租户字段时 不要过滤租户字段
if(isIgnoreTenantCondition){
if (Objects.equals(column, versionColumn)) {
continue;
}
// 过滤乐观锁字段 租户字段
if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) {
}else if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) {
continue;
}
@ -739,8 +756,13 @@ public class TableInfo {
continue;
}
// 忽略租户字段时 不要过滤租户字段
if(isIgnoreTenantCondition){
if (Objects.equals(column, versionColumn)) {
continue;
}
// 过滤乐观锁字段 租户字段
if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) {
}else if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) {
continue;
}

View File

@ -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;

View File

@ -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"))