mikro-orm中EntityManager与EntityRepository是什么?二者有何区别?
MikroORM 中 EntityManager 与 EntityRepository 说明
1. 核心定义
EntityManager
你可以把它理解为整个数据库的通用大管家,管控项目中所有实体类对应的表操作,所有增删改查需求它都能处理,不需要提前做额外的实体绑定配置。
示例代码:
// 获取全局EntityManager实例 const em = orm.em; // 操作User表:查询所有用户 const allUsers = await em.find(User, {}); // 操作Order表:查询id为123的订单 const targetOrder = await em.findOne(Order, { id: 123 }); // 新增Product实体并入库 const newProduct = em.create(Product, { name: "无线耳机", price: 299 }); await em.persistAndFlush(newProduct);
EntityRepository
你可以把它理解为某一类实体的专属管理员,只能处理绑定的单一实体对应的表操作,通常用来封装该实体专属的、复用性高的查询逻辑。
示例代码:
// 定义User实体专属的Repository @Repository(User) export class UserRepository extends EntityRepository<User> { // 封装仅属于User实体的查询方法:查所有成年用户 async findAdultUsers() { return this.find({ age: { $gte: 18 } }); } // 封装仅属于User实体的查询方法:根据手机号查用户 async findByPhone(phone: string) { return this.findOne({ phone }); } } // 使用时直接调用封装好的方法即可 const userRepo = em.getRepository(User); const adultUsers = await userRepo.findAdultUsers(); const targetUser = await userRepo.findByPhone("13800001111");
2. 核心区别
- 管辖范围不同:EntityManager 支持所有实体的操作,EntityRepository 仅支持单个绑定实体的操作
- 适用场景不同:通用的临时增删改查直接用 EntityManager 即可;如果某类实体有大量重复的自定义查询逻辑,封装到 EntityRepository 里复用性更高、代码更整洁
- 底层关系:EntityRepository 本质是对 EntityManager 的浅层封装,Repository 内所有数据库操作最终都是调用内部绑定的 EntityManager 实例实现的
- 调用规则不同:EntityManager 调用操作方法时必须传入实体类作为第一个参数;EntityRepository 已经提前绑定了实体类,调用方法时不需要再传实体类参数
可以用小区管理做通俗类比:EntityManager 是小区物业总负责人,能查所有楼栋的住户信息;EntityRepository 是每栋楼的专属楼长,只负责自己楼栋的住户需求,楼长处理不了的需求最终也是找总负责人处理。
内容的提问来源于stack exchange,提问作者Ashok Kumar
相关产品推荐
相关产品推荐

