You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
6.7 KiB
6.7 KiB
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.sqlmydreamjob-server/src/main/java/com/mydreamjob/skill/domain/OccupationSkill.javaSkillTaxonomyRepositoryTest.javaSkillTaxonomyMigrationTest.javaSkillCloudSeedDataIntegrationTest.javaSkillCloudQueryServiceTest.java- 已有证据日志:
target/skill-cloud-v37-red.log、skill-cloud-v37-final-green.log、skill-cloud-v37-final-package.log
根因闭环
原始启动失败为:
Schema-validation: wrong column type encountered in column [importance_is_proxy]
found [bit (Types#BIT)], but expecting [tinyint (Types#TINYINT)]
闭环判断:
OccupationSkill.importanceIsProxy原先使用显式@JdbcTypeCode(SqlTypes.TINYINT),把 Hibernate 的 JDBC 期望固定为TINYINT。- 本轮已移除该显式注解及其 import;字段仍是
Boolean,列名、可空性和其他字段映射未改变。 - 新回归测试同时断言:
- Hibernate 属性返回类型为
Boolean.class; - 字段不再存在显式
JdbcTypeCode注解。
- Hibernate 属性返回类型为
- V37 将
occupation_skills.importance_is_proxy规范化为BOOLEAN NOT NULL DEFAULT FALSE,并重建原 CHECK 约束。H2MODE=MySQL下迁移测试确认元数据为BOOLEAN / FALSE / NO。 - 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 的顺序为:
- 删除旧的
ck_occupation_skills_importance_proxy; - 将列改为
BOOLEAN NOT NULL DEFAULT FALSE; - 重建
CHECK (importance_is_proxy IN (FALSE, TRUE))。
经验证:
- 默认值:新行未显式赋值时为
FALSE/0。 - 非空:迁移测试断言
IS_NULLABLE=NO,并将 NULL 更新验证为失败。 - 布尔读写:
FALSE、TRUE可读写,查询结果与布尔比较均正确。 - JDBC 断言:查询测试和种子数据测试已兼容 H2 返回
Boolean以及旧驱动可能返回数值两种形式,不会因方言差异误判。 preferred_boolean_jdbc_type=TINYINT:源代码与配置中未发现该属性;标准测试命令不需要额外-D参数。
独立测试与打包结果
环境:
JAVA_HOME=D:\java\jdk
Maven=D:\maven\apache-maven-3.9.7\bin\mvn.cmd
T2–T10 指定测试组
在 mydreamjob-server 下执行,未附加任何布尔类型属性:
mvn -Dtest=SkillCloudAuthorizationIntegrationTest,SkillCloudControllerTest,SkillCloudEndToEndIntegrationTest,SkillCloudQueryServiceTest,SkillCloudSeedDataIntegrationTest,SkillLearningPathServiceTest,SkillMatchServiceTest,SkillTaxonomyMigrationTest,SkillTaxonomyRepositoryTest test
结果:
Tests run: 74, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
Total time: 55.561 s
打包
mvn -DskipTests package
BUILD SUCCESS
Total time: 2.439 s
MySQL 8.0.43 冒烟
实际执行结果:
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 状态
独立执行完整命令:
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/*等文件属于本任务之外的既有未提交内容,不构成本次运行时修复差异。
非阻断观察
V37__skill_cloud_boolean_type.sql当前索引版本与工作区版本存在一个仅涉及列注释的文本差异;两者不影响 DDL 语义,但提交前应统一内容,避免最终提交与独立测试的具体文本不一致。- V37 文件工作区版本末尾缺少换行;非功能问题。
- MySQL 仅完成 8.0.43 二进制冒烟,未在实际 8.4 二进制上复跑;判断为语法兼容,但如需严格的 8.4 认证应补充运行环境验证。
剩余阻断
- 本次运行时启动修复:无阻断。
- 项目最终关闭:完整
mvn test仍有 2 failures + 9 errors;需要修复这些既有测试,或由项目按流程正式记录豁免后,才能推进全量回归结论和最终关闭。