2

PreUpdate HasLifecycleCallbacks に少し問題があります。

私にはエンティティがあります。たとえば、エンティティ「B」との OneToOne 関係を持つ「A」とします。ので、私は持っています:

/**
 * @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 ドキュメントから:

Doctrine はフラッシュ操作のこの時点で参照整合性を正しく処理することを保証できないため、更新されたエンティティの関連付けへの変更はこのイベントでは決して許可されません。

これは理にかなっているので、Unit of Work によってすべての変更セットが生成される前に、関連付けられたエンティティに変更を加える必要があります。そのためのpreFlushイベントです。

preFlush は、何よりも先に EntityManager#flush() で呼び出されます。EntityManager#flush() は、そのリスナー内で安全に呼び出すことができます。

@ORM\PreUpdateアノテーションを に置き換えるだけで機能し@ORM\PreFlushます。

このpreFlushイベントは Doctrine 2.2 以降で利用できます。

Doctrine ドキュメンテーション: 「イベント - preFlush」

Doctrine バグ トラッカー: "preFlush イベントとライフサイクル コールバック"

于 2013-10-01T08:28:37.943 に答える