refactor: 租户重构

This commit is contained in:
Ray.Hao
2025-12-11 08:18:01 +08:00
parent 36d2db6dc5
commit 47cabcbcfc
14 changed files with 789 additions and 44 deletions

View File

@@ -28,6 +28,10 @@ public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 新增填充创建时间、更新时间和租户ID
* <p>
* 多租户模式下tenant_id 字段的 exist 属性会被 TenantDynamicFieldConfig 动态设置为 true
* 因此这里的 strictInsertFill 可以正常工作
* </p>
*
* @param metaObject 元数据
*/
@@ -37,23 +41,16 @@ public class MyMetaObjectHandler implements MetaObjectHandler {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
// 如果启用了多租户自动填充租户ID
// 注意:由于 BaseEntity 中 tenantId 字段使用了 exist = false避免单租户模式报错
// 在启用多租户时,需要通过反射动态修改字段的 exist 属性,或者直接设置值
// 但 MyBatis-Plus 的字段映射是静态的,无法动态修改
// 因此,我们使用 strictInsertFill它会自动处理字段映射
// 如果字段不存在exist = falsestrictInsertFill 会跳过,不会报错
if (tenantProperties != null && Boolean.TRUE.equals(tenantProperties.getEnabled())) {
Long tenantId = TenantContextHolder.getTenantId();
if (tenantId == null) {
// 如果上下文中没有租户ID使用默认租户ID
tenantId = tenantProperties.getDefaultTenantId();
}
if (tenantId != null) {
// 使用数据库字段名tenant_id进行填充
// 注意:由于 exist = false这个填充不会写入数据库
// 但多租户的数据隔离是通过 TenantLineHandler 自动添加 WHERE 条件实现的
// 所以这里只需要设置实体对象的属性值即可(用于业务逻辑)
String propertyName = "tenantId";
if (metaObject.hasGetter(propertyName)) {
// 直接设置值到实体对象,不依赖字段映射
metaObject.setValue(propertyName, tenantId);
}
// 使用 strictInsertFill 自动填充租户ID
// 注意:由于 TenantDynamicFieldConfig 已将 exist 设置为 true这里可以正常填充
this.strictInsertFill(metaObject, "tenantId", () -> tenantId, Long.class);
}
}
}