Doctrine2.3和OneToOne级联持续存在似乎不起作用

时间:2013-08-09 09:42:39

标签: php mysql orm doctrine-orm

我有两个我想要单向映射OneToOne的用户(User和UserPreferences)。

代码看起来像这样:

/**
 * @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配置为级联持久但不是。我在这里弄错了吗?

2 个答案:

答案 0 :(得分:6)

好的找到了解决方案:

/**
 * 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)作为这个的主键。

答案 1 :(得分:0)

Bug与

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

您的代码应包含

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

而不是这个。