必须手动调整atoms生成的多表关联代码:实体集合属性需加@transient;mapper改用resultmap嵌套查询;多对多需补双向导航、建中间表实体、重写save方法。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要在Atoms代码生成器完成多表关联代码后,手动调整生成的实体、Mapper或Service层逻辑,以适配真实业务中一对多、多对多等复杂关联场景。
确认生成代码中关联字段是否已标记为 transient
打开生成的实体类(如 Teacher.java),检查是否包含类似 private List<student> students;</student> 的集合属性。若存在,确认其上方是否有 @Transient 注解或 xorm:"-" 等忽略持久化的声明。没有该声明会导致 MyBatis 或 XORM 尝试将集合映射为数据库字段,引发运行时报错或插入空值异常。
【必须添加 @Transient 或对应框架的忽略注解】
重写查询方法:用 XML Mapper 替代自动生成的单表 SQL
进入 TeacherMapper.xml,删除原生生成的 selectById 方法体,手动编写带 <resultmap></resultmap> 的嵌套查询:
第一步:定义 <resultmap id="TeacherWithStudents"></resultmap>,其中 <collection property="students" oftype="Student"></collection> 明确指定子对象映射路径;
第二步:编写新 <select id="selectTeacherWithStudents"></select>,SQL 中使用 LEFT JOIN student ON teacher.id = student.teacher_id;
第三步:在 Service 层调用该新方法,而非旧的 teacherMapper.selectById()。
这一步不可跳过——自动生成的单表查询无法加载关联数据,硬编码 join 会破坏分页插件兼容性,必须走 resultMap 嵌套映射。
处理中间表多对多关系的三处关键补丁
方法一:在实体中补全双向导航属性
在 Article.java 中添加 private List<tag> tags;</tag>,并标注 @Transient;
在 Tag.java 中添加 private List<article> articles;</article>,同样加 @Transient。
方法二:新增中间表映射实体与 DAO
新建 ArticleTag.java 实体,字段仅含 articleId 和 tagId,无主键注解;
生成对应的 ArticleTagMapper.java 和 XML,用于批量插入/删除中间记录。
方法三:覆盖默认 save 方法
在 ArticleService.java 中重写 save(Article article):
先调用父类保存 Article 主体 → 获取生成的 article.getId() → 清空原 articleTagMapper.deleteByArticleId() → 批量插入新 articleTagMapper.insertBatch(...)。
注意:不要在 Article 实体里直接存 List<long> tagIds</long> 字段并试图用 JSON 字符串入库——这违反第三范式,后续无法索引、无法关联查询。











