簡體   English   中英

Doctrine2.3和OneToOne級聯持續存在似乎不起作用

[英]Doctrine2.3 and OneToOne cascade persist doesn't seem to work

我有兩個entite(User和UserPreferences),我想要單向映射OneToOne。

代碼看起來像這樣:

/**
 * @ORM\Table("users")
 * @ORM\Entity
 */
class User
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     */
    protected $id;

    ...

    /**
     * @ORM\Column(name="user_preferences_id", type="integer")
     * @ORM\OneToOne
     * (
     *      targetEntity="UserPreferences",
     *      cascade={"persist"}
     * )
     */
    protected $userPreferences;

    public function __construct() {
        $this->userPreferences = new UserPreferences();
    }
}


/**
 * @ORM\Table("user_preferences")
 * @ORM\Entity
 */
class UserPreferences extends UserPreferencesEntity
{
    /**
     * @ORM\Id
     * @ORM\Column(name="user_id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    ...
}

現在,當創建新用戶時,將使用新的UserPreferences對象初始化userPreferences。 當試圖堅持user ,Doctrine會拋出異常,聲稱

A new entity was found through the relationship '...\\Entity\\User#userPreferences' that was not configured to cascade persist operations for entity: ...\\Entity\\UserPreferences@000000003ae25e5700000000a6eaafc9. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}).

但我還應該做些什么呢? 用戶#userPreferences配置為級聯持久但不支持。 我在這里弄錯了嗎?

好的找到了解決方案:

/**
 * User
 *
 * @ORM\Table("users")
 * @ORM\Entity
 */
class User extends UserEntity
{
    ...

    /**
     * @ORM\OneToOne
     * (
     *      targetEntity="UserPreferences",
     *      cascade={"persist", "remove"},
     *      inversedBy="user"
     * )
     */
    protected $userPreferences;
}

/**
 * @ORM\Table("user_preferences")
 * @ORM\Entity
 */
class UserPreferences extends UserPreferencesEntity
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue
     */
    protected $id;

    /**
     * @var int
     *
     * @ORM\OneToOne(targetEntity="User", mappedBy="id", cascade={"persist", "remove"})
     */
    protected $user;

    ...
}

首先,我必須指定mappedBy和inversedBy(我之前已經嘗試但是方向錯誤 - 在擁有方面為mappedBy,在反向方向上反轉)。 另外我認為反向的一方不需要有一個單獨的id,我試圖使用擁有方的id(User#id)作為這個的主鍵。

Bug出現了

 * @ORM\Column(name="user_preferences_id", type="integer")

您的代碼應包含

 * @ORM\JoinColumn(name="user_preferences_id", referencedColumnName="id")

而不是這個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM