You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用M3提取Java注解信息以实现代码生成(如ER模型)?

使用M3提取Java注解并实现代码生成

一、从M3模型提取注解信息的步骤

你已经熟悉createM3FromFile和createAstFromFile,基于M3模型提取注解可按以下流程操作:

  • 加载目标模型:通过createM3FromFile加载带注解的Java文件,得到完整的M3元模型。M3会将Java类、字段、注解等元素抽象为可查询的模型节点。
  • 筛选实体类:遍历模型中的Class类型节点,检查节点的annotations集合,筛选出带有javax.persistence.Entity注解的类(即你的实体类)。
  • 提取字段注解:对每个实体类,遍历其关联的fields节点,逐个解析字段上的注解:
    • 对于@Column,提取name、nullable、length等属性值;
    • 对于@Id、@GeneratedValue,标记主键及生成策略;
    • 对于@OneToMany,提取mappedBy属性和关联的目标实体类型。

示例查询逻辑(伪代码)

// 假设m3是已加载的模型实例
for (classNode in m3.Class) {
    // 判断是否为Entity类
    isEntity = any(ann in classNode.annotations where ann.name == "javax.persistence.Entity")
    if (!isEntity) continue

    // 提取实体类信息
    entityInfo = {
        name: classNode.name,
        fields: []
    }

    // 遍历字段解析注解
    for (fieldNode in classNode.fields) {
        fieldData = {
            name: fieldNode.name,
            type: fieldNode.type.name,
            annotations: {}
        }

        // 解析@Column注解
        columnAnn = first(ann in fieldNode.annotations where ann.name == "javax.persistence.Column")
        if (columnAnn) {
            fieldData.annotations.Column = {
                name: columnAnn.properties["name"].value,
                nullable: columnAnn.properties["nullable"].value,
                length: columnAnn.properties["length"].value
            }
        }

        // 解析@OneToMany注解
        oneToManyAnn = first(ann in fieldNode.annotations where ann.name == "javax.persistence.OneToMany")
        if (oneToManyAnn) {
            fieldData.annotations.OneToMany = {
                mappedBy: oneToManyAnn.properties["mappedBy"].value,
                targetEntity: fieldNode.type.name
            }
        }

        // 标记主键
        if (any(ann in fieldNode.annotations where ann.name == "javax.persistence.Id")) {
            fieldData.isPrimaryKey = true
            // 提取@GeneratedValue策略
            genValueAnn = first(ann in fieldNode.annotations where ann.name == "javax.persistence.GeneratedValue")
            if (genValueAnn) {
                fieldData.generationStrategy = genValueAnn.properties["strategy"].value
            }
        }

        entityInfo.fields.push(fieldData)
    }

    // 存储实体信息,用于后续代码生成
    entities.push(entityInfo)
}

二、基于注解信息实现代码生成

以生成DDL脚本或ER模型描述为例:

  • 生成DDL:根据实体类名生成表名,字段的@Column属性生成列定义,主键注解生成主键约束,@OneToMany关联生成外键语句。
  • 生成ER模型:将提取的实体、字段、关联关系整理为结构化数据(如JSON),可直接用于渲染ER图或导入可视化工具。

三、学习资源

  • M3元模型核心文档:聚焦Class、Field、Annotation等节点的属性与关联关系,掌握模型查询的基本方式。
  • JPA官方注解参考:熟悉@Entity、@Column等注解的标准属性定义,确保解析时覆盖所有关键配置。
  • 代码生成模板示例:参考基于M3的代码生成项目,学习如何将模型数据与模板引擎结合,高效生成目标代码。

内容的提问来源于stack exchange,提问作者Pius Arhanbhunde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 13:35:25