158 lines
7.0 KiB
Markdown
158 lines
7.0 KiB
Markdown
|
|
# ORM 实体类重构 - 2026-03-13
|
|||
|
|
|
|||
|
|
> 本文档记录两次 ORM 实体类重构:
|
|||
|
|
> 1. **表名规范化** - 统一表名与实体类名
|
|||
|
|
> 2. **BaseEntity 继承** - 消除重复字段
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 二、BaseEntity 继承重构
|
|||
|
|
|
|||
|
|
### 重构背景
|
|||
|
|
|
|||
|
|
项目中所有 40 个实体类都包含重复的公共字段(`id`, `createdAt`, `updatedAt`, `deleted`),需要统一继承 `BaseEntity` 基类来减少重复代码。
|
|||
|
|
|
|||
|
|
### BaseEntity 定义
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
@Data
|
|||
|
|
public abstract class BaseEntity {
|
|||
|
|
@TableId(type = IdType.ASSIGN_ID)
|
|||
|
|
private Long id;
|
|||
|
|
|
|||
|
|
@CreatedBy
|
|||
|
|
@TableField(fill = FieldFill.INSERT)
|
|||
|
|
private String createBy;
|
|||
|
|
|
|||
|
|
@TableField(fill = FieldFill.INSERT)
|
|||
|
|
private LocalDateTime createdAt;
|
|||
|
|
|
|||
|
|
@LastModifiedBy
|
|||
|
|
@TableField(fill = FieldFill.INSERT_UPDATE)
|
|||
|
|
private String updateBy;
|
|||
|
|
|
|||
|
|
@TableField(fill = FieldFill.INSERT_UPDATE)
|
|||
|
|
private LocalDateTime updatedAt;
|
|||
|
|
|
|||
|
|
@TableLogic
|
|||
|
|
@JsonIgnore
|
|||
|
|
private Integer deleted;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 实体类状态分析
|
|||
|
|
|
|||
|
|
| 状态 | 实体类数量 | 公共字段情况 | 操作 |
|
|||
|
|
|------|-----------|-------------|------|
|
|||
|
|
| A | 37 个 | 完整字段(id, createdAt, updatedAt, deleted) | extends BaseEntity + 移除 4 字段 |
|
|||
|
|
| B | 2 个 | 缺 deleted(CoursePackage, Theme) | extends BaseEntity + 移除 3 字段 |
|
|||
|
|
| C | 1 个 | 缺 updatedAt, deleted(StudentClassHistory) | extends BaseEntity + 移除 2 字段 |
|
|||
|
|
|
|||
|
|
### 修改的实体类清单
|
|||
|
|
|
|||
|
|
#### 状态 B:缺少 deleted 字段(2 个)
|
|||
|
|
|
|||
|
|
| 序号 | 实体类 | 修改内容 |
|
|||
|
|
|------|--------|---------|
|
|||
|
|
| 1 | CoursePackage | 添加 extends BaseEntity,移除 id/createdAt/updatedAt |
|
|||
|
|
| 2 | Theme | 添加 extends BaseEntity,移除 id/createdAt/updatedAt |
|
|||
|
|
|
|||
|
|
#### 状态 C:缺少 updatedAt 和 deleted(1 个)
|
|||
|
|
|
|||
|
|
| 序号 | 实体类 | 修改内容 |
|
|||
|
|
|------|--------|---------|
|
|||
|
|
| 1 | StudentClassHistory | 添加 extends BaseEntity,移除 id/createdAt/deleted |
|
|||
|
|
|
|||
|
|
#### 状态 A:完整字段(37 个)
|
|||
|
|
|
|||
|
|
| 序号 | 实体类 | 修改内容 |
|
|||
|
|
|------|--------|---------|
|
|||
|
|
| 1 | AdminUser | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 2 | Clazz | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 3 | ClassTeacher | 添加 extends BaseEntity,移除 id/createdAt/deleted(缺 updatedAt) |
|
|||
|
|
| 4 | Course | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted/createdBy |
|
|||
|
|
| 5 | CourseActivity | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 6 | CourseLesson | 添加 extends BaseEntity,移除 id/createdAt/updatedAt |
|
|||
|
|
| 7 | CoursePackageCourse | 添加 extends BaseEntity,移除 id |
|
|||
|
|
| 8 | CourseResource | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 9 | CourseScript | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 10 | CourseScriptPage | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 11 | CourseVersion | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 12 | GrowthRecord | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 13 | Lesson | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 14 | LessonFeedback | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 15 | LessonStep | 添加 extends BaseEntity,移除 id/createdAt/updatedAt |
|
|||
|
|
| 16 | LessonStepResource | 添加 extends BaseEntity,移除 id/createdAt/updatedAt |
|
|||
|
|
| 17 | Notification | 添加 extends BaseEntity,移除 id/createdAt/deleted |
|
|||
|
|
| 18 | OperationLog | 添加 extends BaseEntity,移除 id/createdAt |
|
|||
|
|
| 19 | Parent | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 20 | ParentStudent | 添加 extends BaseEntity,移除 id/createdAt/deleted |
|
|||
|
|
| 21 | ResourceItem | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted/createdBy/updatedBy |
|
|||
|
|
| 22 | ResourceLibrary | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted/createdBy/updatedBy |
|
|||
|
|
| 23 | SchedulePlan | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 24 | ScheduleTemplate | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 25 | Student | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 26 | StudentRecord | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 27 | SystemSetting | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 28 | Tag | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 29 | Task | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 30 | TaskCompletion | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 31 | TaskTarget | 添加 extends BaseEntity,移除 id/createdAt/deleted |
|
|||
|
|
| 32 | TaskTemplate | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 33 | Teacher | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 34 | Tenant | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 35 | TenantCourse | 添加 extends BaseEntity,移除 id/createdAt/updatedAt/deleted |
|
|||
|
|
| 36 | TenantPackage | 添加 extends BaseEntity,移除 id/createdAt/updatedAt |
|
|||
|
|
|
|||
|
|
### 修改模式
|
|||
|
|
|
|||
|
|
每个实体类按照以下模式修改:
|
|||
|
|
|
|||
|
|
1. **添加 `extends BaseEntity`** 到类声明
|
|||
|
|
2. **添加 `@EqualsAndHashCode(callSuper = true)`** 注解
|
|||
|
|
3. **移除重复字段**:
|
|||
|
|
- `Long id`(带 `@TableId` 注解)
|
|||
|
|
- `LocalDateTime createdAt`(带 `@TableField(fill = FieldFill.INSERT)`)
|
|||
|
|
- `LocalDateTime updatedAt`(带 `@TableField(fill = FieldFill.INSERT_UPDATE)`)
|
|||
|
|
- `Integer deleted`(带 `@TableLogic`)
|
|||
|
|
- `String createBy` 和 `String updateBy`(如果存在)
|
|||
|
|
4. **清理 import**:
|
|||
|
|
- 移除 `import com.baomidou.mybatisplus.annotation.*;`
|
|||
|
|
- 只保留实际使用的注解 import
|
|||
|
|
- 添加 `import lombok.EqualsAndHashCode;`
|
|||
|
|
- 移除不再使用的 `import java.time.LocalDateTime;`
|
|||
|
|
|
|||
|
|
### 验证结果
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
export JAVA_HOME="/f/Java/jdk-17"
|
|||
|
|
mvn clean compile -DskipTests
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**编译结果**: ✅ BUILD SUCCESS
|
|||
|
|
|
|||
|
|
**警告说明**: MapStruct 提示部分字段未映射(如 `createBy`, `updateBy` 等),这些警告不影响运行,是因为 BaseEntity 新增的字段在 DTO 映射时需要显式处理。
|
|||
|
|
|
|||
|
|
### 数据库迁移脚本
|
|||
|
|
|
|||
|
|
创建了 3 个 Flyway 迁移脚本:
|
|||
|
|
|
|||
|
|
1. **V20260313__rename_tables_to_singular.sql** - 表名规范化(复数改单数)
|
|||
|
|
2. **V20260313_2__add_audit_fields.sql** - 为所有表添加审计字段(create_by, update_by)
|
|||
|
|
3. **V20260313_3__fix_missing_tables.sql** - 修复缺失的表(创建所有未创建的表)
|
|||
|
|
|
|||
|
|
**V20260313_2__add_audit_fields.sql 说明**:
|
|||
|
|
- 为 39 个表添加了 `create_by` 和 `update_by` 字段
|
|||
|
|
- 为部分表补充了缺失的 `deleted`、`created_at`、`updated_at` 字段
|
|||
|
|
- 确保数据库表结构与 BaseEntity 实体类保持一致
|
|||
|
|
|
|||
|
|
**V20260313_3__fix_missing_tables.sql 说明**:
|
|||
|
|
- 创建 V1 和 V20260313 迁移中缺失的所有基础表
|
|||
|
|
- 包含所有 39 个实体类对应的数据库表
|
|||
|
|
- 自动包含所有必要的字段和索引
|
|||
|
|
- 插入默认超级管理员账号(admin/123456)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 一、表名规范化重构
|