Doctrine 2通过外国实体的OneToOne身份在持续存在时出错

时间:2016-02-22 23:09:51

标签: php symfony doctrine-orm

我们必须在我们的应用程序中重构许多实体,因为我们与另一个应用程序共享数据库和表,并且有更新改变了数据结构,我们必须跟进新结构。

这意味着某些实体被拆分为2或3个表格,因此我们按照tutorial设置了OneToOne关系,但在每次尝试持久保存主要和相关实体时都会遇到问题。

每当我们尝试通过实体管理器刷新更改时(在有或没有级联持久化的情况下持久保存主要和相关实体之后),我们得到500错误状态响应,没有响应数据(甚至使用app_dev.php)并且我们收到此消息在日志中:

request.CRITICAL: 
Uncaught PHP Exception Symfony\Component\Debug\Exception\ContextErrorException: 
"Notice: Undefined index: 000000003440ddf300000000391d8640" at 
vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php line 2905 
{"exception":"[object] 
(Symfony\\Component\\Debug\\Exception\\ContextErrorException(code: 0): 
Notice: Undefined index: 000000003440ddf300000000391d8640 at 
vendor\\doctrine\\orm\\lib\\Doctrine\\ORM\\UnitOfWork.php:2905)"} []

我们正在创建新实体,因此缓存实体不存在问题。

以下是我们如何定义实体和关系的示例代码。 (我们尝试使用和不使用id属性,但我们最终遇到了相同的问题)

/**
 * @ORM\Table(name="contacts_accounts_1_c")
 * @ORM\Entity
 */
class ContactsAccounts1C
{
    /**
     * @var string
     * @ORM\Column(name="id", type="string", length=36, nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var ContactsAccounts1CExtradata
     * @ORM\OneToOne(targetEntity="ContactsAccounts1CExtradata", mappedBy="principal", cascade={"ALL"})
     */
    private $extradata;
    ...
}

/**
 * @ORM\Table(name="contacts_accounts_1_c_extradata")
 * @ORM\Entity()
 */
class ContactsAccounts1CExtradata {
    /**
     * @var string
     * @ORM\Column(name="id", type="string", length=36, nullable=false)
     */
    private $id;

    /**
     * @var ContactsAccounts1C
     * @ORM\Id
     * @ORM\OneToOne(targetEntity="ContactsAccounts1C", inversedBy="extradata")
     * @ORM\JoinColumn(name="id")
     */
    private $principal;
    ...
}

如果我们避免设置/创建extradata实体,则主体实体最终会成功保留。

我发现this question似乎有关但仍未解决。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

快速浏览一下,这个注释在校长上看起来不合适:

 * @ORM\JoinColumn(name="id")

鉴于您的关系是主要的 - > extradata似乎没有地方。

答案 1 :(得分:0)

发现问题:GeneratedValue被错误地定义并覆盖了主要实体。 解决方案:对主要实体(拥有方)使用@GeneratedValue(strategy =“UUID”),对相关实体(拥有方)使用@GeneratedValue(strategy =“NONE”)。