2

PreUpdate HasLifecycleCallbacks 有一些问题。

我有一个实体,假设“A”与实体“B”有 OneToOne 关系。所以我有:

/**
 * @ORM\Entity()
 * @ORM\HasLifecycleCallbacks
 */
 class A
{
    /**
     * @ORM\OneToOne(targetEntity="B", inversedBy="attrA", cascade={"persist", "remove"})
     * @ORM\JoinColumn(name="fieldB", referencedColumnName="id")
     */
    private $attrB;

    public function __construct()
    {
        $this->attrB = new B();
    }

    /**
     * @ORM\PrePersist
     * @ORM\PreUpdate
     */
    public function updateSomthing(){
        //$gestor = fopen("/pruebitas.txt", "r");
        $this->attrB->setDate($this->getDate());
   }
}

B类是:

class B
{
    /**
     * @ORM\OneToOne(targetEntity="A", mappedBy="attrB")
     */
    private $attrA;
}

当我创建一个新的实体 A 时,一切正常,问题是当我更新实体 A 时,PreUpdate 函数被触发,(因为它在注释行中创建文件),但实体 B 不会保留在数据库中,即使 B 中的字段应该更新。

有什么想法可以在 PreUpdate 上级联持久化吗?

谢谢!!

4

2 回答 2

10

preFlush改为使用

preUpdate事件的教义文档中:

在这种情况下,永远不允许对更新实体的关联进行更改,因为 Doctrine 不能保证在刷新操作的此时正确处理引用完整性。

这是有道理的,因此您需要在工作单元生成所有变更集之前对关联实体进行更改。这就是preFlush活动的目的。

preFlush 在 EntityManager#flush() 之前被调用。EntityManager#flush() 可以在其侦听器中安全地调用。

只需将您的@ORM\PreUpdate注释替换为@ORM\PreFlush它应该可以工作。

preFlush事件从 Doctrine 2.2 开始可用。

教义文档:“事件 - preFlush”

教义错误跟踪器:“preFlush 事件和生命周期回调

于 2013-10-01T08:28:37.943 回答
-1

如果您对 preUpdate 侦听器中的实体进行更改,则需要在工作单元上手动调用 ->recomputeSingleEntityChangeSet()。

/**
 * @ORM\PrePersist
 * @ORM\PreUpdate
 */
public function updateSomething($eventArgs)
{
    $this->attrB->setDate($this->getDate());

    $em = $eventArgs->getEntityManager();
    $uow = $em->getUnitOfWork();
    $meta = $em->getClassMetadata(get_class($entity));
    $uow->recomputeSingleEntityChangeSet($meta, $entity);
}
于 2013-07-09T15:32:59.633 回答