我遇到了一个未正确刷新的实体的问题。
在一项服务中,我设置了一些值。在将它们刷新到服务中之前,我调用了另一个服务,并且看到有一个侦听器链接在一起。 在此侦听器中,女巫中有一个postPersist方法,称为“ $ entityManager-> flush();”。
这是我问题的根源。
我发现了这篇文章:Doctrine inserting in postPersist event
因此,我删除了在postPersist中完成的冲洗。
但是我不理解方法postFlush的需要。
就我而言,即使我没有此方法,也会刷新数据。在没有此事件的情况下,如何正确刷新侦听器中设置的属性?
如果我查看其他入口点,会发现需要声明postFlush事件,并且看到需要此方法。
感谢您的帮助
答案 0 :(得分:1)
否,您不需要在postPersist事件中刷新,因为它将在Persist之后很快完成。您无需使用列表的所有功能,也无需声明它们。
ps .:仅当您需要在持久/刷新之前获取/设置数据时。您将需要计算更改,然后将其添加到“耦合”操作中(例如prePersist和postPersist,preUpdate和postUpdate)。 文档说:
对传递的实体的字段所做的更改无法被 刷新操作,请使用传递给 事件以修改原始字段值。
和
getEntityChangeSet()获取变更集数组的副本。更改为 此返回的数组不会影响更新。
PostFlush
postFlush在刷新操作结束时进行。根据文档,此事件不是生命周期回调。注册后,您甚至可以使用它来设置某些内容,甚至发送通知,而使用postFlush则很明显,您无需担心lifeCycle事件。
postFlush-postFlush事件在刷新结束时发生 操作。此事件不是生命周期回调。
对于文档中的postPersist
postPersist-在实体之后,实体发生postPersist事件 实体已设置为持久性。它会在数据库之后被调用 插入操作。生成的主键值可在 postPersist事件。
如果需要在刷新之前在这里可以有ID。
您可以在此处查看有关LifeCycleEvents的文档: https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#lifecycle-events