PostPersist正在调用但不保存

时间:2017-08-28 13:34:28

标签: symfony doctrine-orm doctrine

我有一个实体根据数字ID创建哈希,并使用 PostPersist 生命周期钩子创建盐。

我已验证正在触发setHash方法并指定正确的字符串(通过日志记录),但db中的hash列为空。

什么可能阻止价值储蓄?

/**
 * Deployment
 *
 * @ORM\Table(name="deployments")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\DeploymentRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class Deployment

    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=16, nullable=true)
     */
    protected $hash;

    ...

    /**
     * @ORM\PostPersist
     */
    public function setHash()
    {
        $hashids = new Hashids($this->hashSalt, 5, 'abcdefghijkmnopqrstuvwxyz');
        $this->hash = $hashids->encode($this->getId());
    }

    ...
}

1 个答案:

答案 0 :(得分:0)

来自Doctrine documentation

<块引用>

postUpdate、postRemove、postPersist 这三个 post 事件在 EntityManager#flush() 中调用。此处的更改与数据库中的持久性无关,但您可以使用这些事件来更改非持久性项目,例如非映射字段、日志记录甚至是未由 Doctrine 直接映射的关联类。

意味着您对实体的更改不会在 perist() 和 flush() 之间保存

如果你真的需要一个事件你可以做什么,你可以尝试一个 postFlushEvent,在那里你检查哈希是否为空,如果是,设置它并再次刷新,但要注意无限循环(确保你只重新刷新如果哈希为空)。

但是每次您的 entityManager 刷新时都会触发该事件,以进行更新。我的建议是,如果您只保留代码的一处,只需手动执行即可。如果有几个地方可以持久化实体,就去事件。

相关问题