Skip to content

🐛 fix(generator): 规范化非法 Java 标识符 - #96

Merged
ZhaoXingPeng merged 1 commit into
mainfrom
fix/95-java-identifiers
Sep 7, 2026
Merged

🐛 fix(generator): 规范化非法 Java 标识符#96
ZhaoXingPeng merged 1 commit into
mainfrom
fix/95-java-identifiers

Conversation

@ZhaoXingPeng

Copy link
Copy Markdown
Owner

背景

真实数据库允许连字符、空格、数字开头和保留字作为表名或列名。原有转换会把 order-item 生成成非法的 Order-item,把 class 直接作为 Java 字段,生成源码无法编译;核心模型、现代模板和 legacy 模板还各自维护命名逻辑。

变更

  • 新增共享 core.java_identifiers,统一 PascalCase/camelCase、非法分隔符、数字开头、空名称和 Java 关键字处理。
  • TableInfoTemplateContextBuilder、legacy TemplateContext 和 AI 命名规则统一调用该实现。
  • 仅规范生成的 Java 名称;tableName/columns.name 仍保留数据库原始标识符,保证 SQL/ORM 映射不变。
  • 更新模板变量说明,明确生成名和数据库原名的边界。

验证

  • PYTHONPATH=src python -m pytest -q tests/unit:638 passed
  • 特殊名称定向测试:143 passed
  • ruff check src tests scripts:通过
  • 变更 Python 文件 ruff format --check:通过

实验与结果

输入表名 order-item、列名 class123_display-name,输出分别为 OrderItemclass_generated123DisplayName,均通过 Java 标识符校验;原始名称仍完整保留在 context。性能未测量,本 PR 不宣称性能提升。

风险与回滚

规范化可能改变此前对特殊名称生成的类名/字段名,但这是从非法源码到合法源码的必要行为;标准 snake_case 名称输出保持兼容。回滚可通过 revert 本次 squash commit 完成。

Closes #95

@ZhaoXingPeng

Copy link
Copy Markdown
Owner Author

问题复现:TableInfo(name="order-item").entity_name 原来得到 Order-item,包含连字符;TemplateContextBuilder 对列名 class 原样生成 class。这两种结果分别会破坏 Java 类声明和字段声明,属于可直接复现的生成器缺陷。

@ZhaoXingPeng

Copy link
Copy Markdown
Owner Author

实现实验:输入表名 order-item、列名 class123_display-name,共享规则输出 OrderItemclass_generated123DisplayNametableName 与列的 name 字段仍是原始数据库名称,SQL/ORM 映射不会被改写。

@ZhaoXingPeng

Copy link
Copy Markdown
Owner Author

测试记录:核心模型、现代模板上下文、legacy 模板上下文和 AI 命名规则定向测试 143 passed;全量单测 638 passed,Ruff lint/format 均通过。此修复未建立前后运行时基准,性能未测量,不宣称性能提升。

@ZhaoXingPeng
ZhaoXingPeng merged commit 61422dc into main Sep 7, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

🐛 fix(generator): 规范化非法 Java 标识符

1 participant