Doctrine 2 OneToOne Identity through foreign Entities Error while persisting

Posted

技术标签:

【中文标题】Doctrine 2 OneToOne Identity through foreign Entities Error while persisting【英文标题】: 【发布时间】:2016-02-22 23:09:51 【问题描述】:

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

这意味着一些实体被拆分为 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;
    ...

如果我们避免设置/创建额外数据实体,主体实体最终会成功持久化。

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

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

一眼看去,这个注解在主体上显得格格不入:

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

鉴于您的关系是主体 -> 额外数据,它似乎在那里没有位置。

【讨论】:

是的,因为它是通过主键连接的,所以不需要它,但它是作为提醒的。【参考方案2】:

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

【讨论】:

以上是关于Doctrine 2 OneToOne Identity through foreign Entities Error while persisting的主要内容,如果未能解决你的问题,请参考以下文章

EntityAudit - Doctrine2:可能在 OneToMany 和 OneToOne 中使用相同的实体

Doctrine 2 OneToOne Identity through foreign Entities Error while persisting

Doctrine 和 SymfonySeoBundle 复制 OneToOne 关系

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

Symfony2,Doctrine OneToOne 关系

为啥这个 Doctrine OneToOne 自引用双向关联不起作用?