MikroORM中使用em.create创建的实体是否为托管实体?会被em.flush持久化吗?
em.create 与实体托管状态、持久化规则说明 核心问题解答
- 通过
em.create创建的实体 默认不会自动处于托管状态em.create属于实体工厂方法,仅负责完成实例化、元数据校验、默认值填充、关联字段初始化操作,不会主动将实体纳入EntityManager的托管单元,不属于官方文档定义的两类托管实体范畴。 - 这类实体 默认不会被
em.flush触发持久化
仅当满足以下任一条件时,em.create生成的实体才会进入持久化队列被em.flush处理:- 手动调用
em.persist()显式注册该实体为托管对象 - 该实体被其他已处于托管状态的实体通过带持久化级联的关联关系引用,被UoW自动纳入变更集计算
- 手动调用
- 完全可以创建出不会被
em.flush持久化的em.create实例
常见实现方式:- 不对该实例调用
em.persist(),同时确保没有任何已托管实体通过带持久化级联的关系关联到它,保持其临时游离状态 - 若已与托管实体建立关联但无需持久化,可在关联定义中移除
PERSIST级联配置,阻断UoW的自动持久化扫描 - 若实体已被误纳入待持久化队列,可调用
em.detach()将其从托管单元中移除,em.flush将跳过该实例的持久化逻辑
- 不对该实例调用
注意:若
em.create传入的参数中包含已托管的关联实体,这些关联对象本身仍保持托管状态,仅新创建的主实体不会自动被托管。
内容的提问来源于stack exchange,提问作者Vitor Rangel
相关产品推荐
相关产品推荐

