# N03 运行时启动缺陷修复独立复审报告 ## Verdict **PASS** 运行时启动缺陷的本轮修复通过独立复审:实体不再强制 `TINYINT` 映射,V37 将 H2 侧列规范化为 `BOOLEAN`,MySQL 侧保持 `BOOLEAN/TINYINT(1)` 语义;标准 T2–T10 回归和跳过测试的打包均通过。完整 `mvn test` 仍有既有、非本次修复引入的失败,不能据此声称全量回归通过。 ## 审查对象 - `mydreamjob-server/src/main/resources/db/migration/V37__skill_cloud_boolean_type.sql` - `mydreamjob-server/src/main/java/com/mydreamjob/skill/domain/OccupationSkill.java` - `SkillTaxonomyRepositoryTest.java` - `SkillTaxonomyMigrationTest.java` - `SkillCloudSeedDataIntegrationTest.java` - `SkillCloudQueryServiceTest.java` - 已有证据日志:`target/skill-cloud-v37-red.log`、`skill-cloud-v37-final-green.log`、`skill-cloud-v37-final-package.log` ## 根因闭环 原始启动失败为: ```text Schema-validation: wrong column type encountered in column [importance_is_proxy] found [bit (Types#BIT)], but expecting [tinyint (Types#TINYINT)] ``` 闭环判断: 1. `OccupationSkill.importanceIsProxy` 原先使用显式 `@JdbcTypeCode(SqlTypes.TINYINT)`,把 Hibernate 的 JDBC 期望固定为 `TINYINT`。 2. 本轮已移除该显式注解及其 import;字段仍是 `Boolean`,列名、可空性和其他字段映射未改变。 3. 新回归测试同时断言: - Hibernate 属性返回类型为 `Boolean.class`; - 字段不再存在显式 `JdbcTypeCode` 注解。 4. V37 将 `occupation_skills.importance_is_proxy` 规范化为 `BOOLEAN NOT NULL DEFAULT FALSE`,并重建原 CHECK 约束。H2 `MODE=MySQL` 下迁移测试确认元数据为 `BOOLEAN / FALSE / NO`。 5. MySQL 8.0.43 临时实例实际执行同一 DDL 后,物理元数据为 `tinyint / tinyint(1) / default 0 / NO`,读写结果为默认 `0`、`FALSE=0`、`TRUE=1`。 因此根因修复成立:实体不再强制 TINYINT;H2 使用真正的 BOOLEAN;MySQL 保留 BOOLEAN 别名对应的 TINYINT(1) 物理语义。 ## V35/V36 与 Flyway 安全检查 独立比较结果: - `V35__skill_cloud_taxonomy.sql`:工作区与 `HEAD` 的 Git hash 均为 `db81f934...`,无差异。 - `V36__skill_cloud_seed.sql`:工作区与 `HEAD` 的 Git hash 均为 `e4a03a40...`,无差异。 - V35/V36 均未改写,已应用环境的 Flyway checksum 不受影响。 - V37 为追加迁移,未修改历史迁移内容。 H2 `MODE=MySQL` 兼容性由实际迁移与测试上下文启动验证;MySQL 兼容性由 MySQL 8.0.43 实例实际执行 `DROP CONSTRAINT`、`MODIFY COLUMN BOOLEAN`、`ADD CONSTRAINT` 验证。MySQL 8.4 未在本机安装,未做 8.4 二进制验证;所用 DDL 语法属于 MySQL 8.0/8.4 的通用受支持语法。 ## 布尔语义、默认值与 NULL 检查 V37 的顺序为: 1. 删除旧的 `ck_occupation_skills_importance_proxy`; 2. 将列改为 `BOOLEAN NOT NULL DEFAULT FALSE`; 3. 重建 `CHECK (importance_is_proxy IN (FALSE, TRUE))`。 经验证: - 默认值:新行未显式赋值时为 `FALSE/0`。 - 非空:迁移测试断言 `IS_NULLABLE=NO`,并将 NULL 更新验证为失败。 - 布尔读写:`FALSE`、`TRUE` 可读写,查询结果与布尔比较均正确。 - JDBC 断言:查询测试和种子数据测试已兼容 H2 返回 `Boolean` 以及旧驱动可能返回数值两种形式,不会因方言差异误判。 - `preferred_boolean_jdbc_type=TINYINT`:源代码与配置中未发现该属性;标准测试命令不需要额外 `-D` 参数。 ## 独立测试与打包结果 环境: ```text JAVA_HOME=D:\java\jdk Maven=D:\maven\apache-maven-3.9.7\bin\mvn.cmd ``` ### T2–T10 指定测试组 在 `mydreamjob-server` 下执行,未附加任何布尔类型属性: ```text mvn -Dtest=SkillCloudAuthorizationIntegrationTest,SkillCloudControllerTest,SkillCloudEndToEndIntegrationTest,SkillCloudQueryServiceTest,SkillCloudSeedDataIntegrationTest,SkillLearningPathServiceTest,SkillMatchServiceTest,SkillTaxonomyMigrationTest,SkillTaxonomyRepositoryTest test ``` 结果: ```text Tests run: 74, Failures: 0, Errors: 0, Skipped: 0 BUILD SUCCESS Total time: 55.561 s ``` ### 打包 ```text mvn -DskipTests package BUILD SUCCESS Total time: 2.439 s ``` ### MySQL 8.0.43 冒烟 实际执行结果: ```text id importance_is_proxy 1 0 2 0 3 1 DATA_TYPE COLUMN_TYPE COLUMN_DEFAULT IS_NULLABLE tinyint tinyint(1) 0 NO ``` 说明:MySQL 将 `BOOLEAN` 规范化为 `tinyint(1)` 属正常行为;这与 V37 目标及 H2 的 `BOOLEAN` 元数据要求一致。 ## 完整 `mvn test` 状态 独立执行完整命令: ```text mvn test Tests run: 1396, Failures: 2, Errors: 9, Skipped: 0 BUILD FAILURE ``` 失败项仍为与本功能无关的既有问题: - `CareerProgressServiceTest.fullAggregation_returnsCorrectSummaries`:固定过期时间导致期望 1、实际 0。 - `JobReviewDimensionControllerTest.listReviews_shouldReturnDimensionScores`:测试仍使用旧服务方法签名,返回 500。 - `JobReviewDimensionServiceTest.listReviews_shouldReturnDimensionScoresWithoutN1`:测试仍 stub 旧 Repository 方法,结果为 null。 - `LocalResumeStorageServiceTest`:Windows JUnit 临时目录清理的 8 个 `AccessDeniedException` 错误。 Skill Cloud 相关测试在完整套件中通过;但按退出条件,完整 `mvn test` 仍未全绿,不能声称全量回归通过。 ## 范围与遮蔽检查 - 本次修复的生产代码变更仅涉及 `OccupationSkill` 和新增 V37;其余变更为相应专项测试的布尔兼容与回归断言。 - 未修改 `SecurityConfig`、接口、DTO、业务查询逻辑或其他 schema 映射。 - `SkillTaxonomyRepositoryTest` 原有的 schema filter 仍只限制 H2 测试环境的旧表验证范围,本轮没有扩大或借助该 filter 掩盖 V37 相关 schema 问题;V37 专项迁移测试直接检查 `information_schema` 元数据和约束。 - 工作区中 `.trae/*` 等文件属于本任务之外的既有未提交内容,不构成本次运行时修复差异。 ## 非阻断观察 1. `V37__skill_cloud_boolean_type.sql` 当前索引版本与工作区版本存在一个仅涉及列注释的文本差异;两者不影响 DDL 语义,但提交前应统一内容,避免最终提交与独立测试的具体文本不一致。 2. V37 文件工作区版本末尾缺少换行;非功能问题。 3. MySQL 仅完成 8.0.43 二进制冒烟,未在实际 8.4 二进制上复跑;判断为语法兼容,但如需严格的 8.4 认证应补充运行环境验证。 ## 剩余阻断 - 本次运行时启动修复:无阻断。 - 项目最终关闭:完整 `mvn test` 仍有 2 failures + 9 errors;需要修复这些既有测试,或由项目按流程正式记录豁免后,才能推进全量回归结论和最终关闭。