MikroORM创建实体时Collection触发额外更新查询的解决方法
解决MikroORM创建实体时的额外更新查询问题
核心原因
你遇到的额外更新查询,本质是因为MikroORM会把实体里已初始化的空Collection当成需要处理的关联关系。哪怕集合里没数据,它也会在插入User后,尝试把这些空关联的外键更新成新User的ID,于是就生成了where "id" is null的奇怪语句——毕竟空集合里没有实体,只能用null去匹配。
具体解决办法
别默认初始化空集合
如果你的User实体里把userCars、auth这些Collection默认写成new Collection(...),赶紧改掉。要么把初始值设为null,要么只在需要往集合里加数据的时候再初始化。这样MikroORM就不会把空集合当成待持久化的关联处理。按需调整级联策略
要是你的业务场景不需要对空集合做级联操作,可以把Cascade.ALL换成更精准的组合,比如Cascade.PERSIST | Cascade.MERGE。这样既保留了正常关联数据的级联逻辑,又不会触发空集合的多余操作。当然,这个得根据你的实际业务来,别瞎改影响正常功能。创建实体时不传递空集合字段
用em.create(User, {...})的时候,别在参数里加空的userCars或auth字段。只要不传这些字段,MikroORM就不会处理对应的关联,自然不会生成额外的更新语句。
要不要手动设为null?
不用特意手动设null,只要别初始化空集合,或者创建实体时不传空集合字段就行。手动设null虽然也能解决,但属于多此一举,不如从根源上避免初始化空集合更省心。
内容的提问来源于stack exchange,提问作者xDD
相关产品推荐
相关产品推荐

