搜索 K
Appearance
Appearance
@Model / @Field 的设计借鉴了 oinone-pamirs 的「外层注解承载基础元信息 + 内嵌注解承载类型与高级配置」的范式:
@Model 标识“这是一个模型”,@Field 标识“这是一个字段”@Model.Advanced / @Field.Advanced 承载更细的配置@Field.String / @Field.Date / @Field.BigDecimal 显式表达数据库列类型这样做的收益:
@Field 撑成几十个参数@Field(基础元信息)+ @Field.Advanced(持久化配置)+ @Field.String(类型与长度),各司其职所有注解都打了 @Target(ElementType.TYPE/FIELD) 与 @Retention(RetentionPolicy.RUNTIME) 前置知识。这是反射读注解的硬性前提。
@Target 决定注解只能贴在哪类元素上(类、字段、方法…)@Retention 决定注解保留到哪个阶段,必须是 RUNTIME 才能被反射读到CLASS(默认值)的话,clazz.getAnnotation(Model.class) 永远返回 null
@Model/@Model.Advanced的@Target为TYPE;@Field及所有子注解的@Target为FIELD。默认值与字段含义详见 API 参考 · 注解 API。
把上述注解树叠加到一个 POJO 上后,框架会按以下规则解析每个字段的列名与类型。完整可复制代码示例请见 使用指南 · 注解使用示例,这里只列出推导路径对照表:
| 字段写法 | 推导出的列名 | 推导出的类型 |
|---|---|---|
@Field.String(length = 64) + @Field.Advanced(column = "user_name") String name | user_name(显式声明) | VARCHAR(64) |
@Field.Integer Integer age | age(驼峰下划线) | INT |
@Field.BigDecimal(precision = 12, scale = 2) BigDecimal balance | balance | DECIMAL(12,2) |
@Field.Date(type = DateType.TIMESTAMP) LocalDateTime registerTime | register_time | TIMESTAMP |
@Field + @Field.Advanced(store = false) String runtimeToken | — | 不落库 |
ModelTypeEnum 描述模型在 DDL 体系中的身份。当前阶段只承诺 STORE 模型的扫描结果可用,其余取值(TRANSIENT / ABSTRACT / PROXY)预留语义到后续阶段使用。完整取值表 → 注解使用示例 · 附录 · ModelTypeEnum。FieldType 描述字段业务类型,由 FieldTypeHelper 在扫描期间从「子注解 → Java 类型」双层推导得出,详见 扫描机制 · 类型推导。DateType 在 @Field.Date(type = ...) 上使用,取值 DATE / DATETIME / TIMESTAMP / TIME,完整语义 → 注解使用示例 · 附录 · DateType。嵌套注解读起来很美,但有一个使用层面的尖角:@Field.String 与 java.lang.String 同名。如果在业务代码里 import cn.cvking.forge.ddl.annotation.Field.String;,会跟 java.lang.String 冲突。
对策:
java.lang.String 全限定名(见 Field.java:18 与 Field.java:23)@Field.String(length = 64) 用复合名引用,避免冲突