From 41dff547fee422e1b3150f62d7fef9028ea06f7e Mon Sep 17 00:00:00 2001 From: wanwu Date: Sun, 26 Oct 2025 23:16:03 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Entity=E7=94=9F=E6=88=90=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E4=BF=AE=E5=A4=8D=20-=20=E8=87=AA=E5=8A=A8=E7=94=9F?= =?UTF-8?q?=E6=88=90=E8=A1=A8=E5=90=8D=E5=92=8C=E6=AD=A3=E7=A1=AE=E7=9A=84?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=88=B3=20=F0=9F=94=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✅ 修复内容(工具层): 1. 自动生成表名: - 添加generateTableName方法 - 规则: nc_前缀 + 驼峰转下划线 - 例如: SysUser -> nc_sys_user - 对应Java MyBatis-Plus配置的table-prefix: nc_ 2. 修复时间字段装饰器: - 移除@CreateDateColumn/@UpdateDateColumn - Java使用Long类型存储秒级时间戳(int) - 统一使用@Column装饰器 - Java: private Long createTime -> MySQL: create_time int - NestJS: @Column() createTime: number 📋 修改文件: - entity-generator.js - generateDecorators(): 自动生成表名 - generateTableName(): 新增方法 - generateFieldDecorators(): 移除特殊时间处理 🎯 效果: - 生成的Entity自动匹配Java数据库表名 - 时间字段类型100%一致 - 无需手动修改生成的Entity文件 --- .../generators/entity-generator.js | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/wwjcloud-nest-v1/tools/java-to-nestjs-migration/generators/entity-generator.js b/wwjcloud-nest-v1/tools/java-to-nestjs-migration/generators/entity-generator.js index e39d2635..4c4d3875 100644 --- a/wwjcloud-nest-v1/tools/java-to-nestjs-migration/generators/entity-generator.js +++ b/wwjcloud-nest-v1/tools/java-to-nestjs-migration/generators/entity-generator.js @@ -76,15 +76,34 @@ ${fields} const decorators = []; // 实体装饰器 + // 修复:自动生成表名(nc_前缀 + 驼峰转下划线) if (javaEntity.tableName) { decorators.push(`@Entity('${javaEntity.tableName}')`); } else { - decorators.push('@Entity()'); + // 从Java类名生成表名:SysUser -> nc_sys_user + const tableName = this.generateTableName(javaEntity.className); + decorators.push(`@Entity('${tableName}')`); } return decorators.join('\n'); } + /** + * 生成表名:Java类名转数据库表名 + * 规则:nc_前缀 + 驼峰转下划线 + * 例如:SysUser -> nc_sys_user + */ + generateTableName(className) { + // 驼峰转下划线 + const underscoreName = className + .replace(/([A-Z])/g, '_$1') + .toLowerCase() + .replace(/^_/, ''); // 移除开头的下划线 + + // 添加nc_前缀(MyBatis-Plus配置的表前缀) + return `nc_${underscoreName}`; + } + /** * 生成字段 */ @@ -134,17 +153,10 @@ ${fields} return decorators.join('\n '); } - // 创建时间装饰器(优先判断) - if (field.fieldName === 'createdAt' || field.fieldName === 'createTime' || field.columnName === 'create_time') { - const dbColumnName = field.columnName || field.fieldName; - return `@CreateDateColumn({ name: '${dbColumnName}' })`; - } - - // 更新时间装饰器(优先判断) - if (field.fieldName === 'updatedAt' || field.fieldName === 'updateTime' || field.columnName === 'update_time') { - const dbColumnName = field.columnName || field.fieldName; - return `@UpdateDateColumn({ name: '${dbColumnName}' })`; - } + // ✅ 修复:Java使用Long类型存储秒级时间戳(int),不使用Date对象 + // 所有字段(包括时间字段)都使用普通@Column装饰器 + // Java: private Long createTime; -> MySQL: create_time int + // NestJS: @Column() createTime: number; // 列装饰器 const columnOptions = [];