kindergarten_java/docs/dev-logs/2026-03-13-orm-refactor.md
En 6e11c874d2 chore: 忽略 target 目录和 .class 文件
- 添加 target/ 到 .gitignore
- 从 git 暂存区移除已追踪的 target 目录

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 16:50:54 +08:00

158 lines
7.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 个 | 缺 deletedCoursePackage, Theme | extends BaseEntity + 移除 3 字段 |
| C | 1 个 | 缺 updatedAt, deletedStudentClassHistory | extends BaseEntity + 移除 2 字段 |
### 修改的实体类清单
#### 状态 B缺少 deleted 字段2 个)
| 序号 | 实体类 | 修改内容 |
|------|--------|---------|
| 1 | CoursePackage | 添加 extends BaseEntity移除 id/createdAt/updatedAt |
| 2 | Theme | 添加 extends BaseEntity移除 id/createdAt/updatedAt |
#### 状态 C缺少 updatedAt 和 deleted1 个)
| 序号 | 实体类 | 修改内容 |
|------|--------|---------|
| 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
---
## 一、表名规范化重构