Doctrine 2 OneToOne 实体映射返回空实体

Posted

技术标签:

【中文标题】Doctrine 2 OneToOne 实体映射返回空实体【英文标题】:Doctrine 2 OneToOne entity mapping returns empty Entities 【发布时间】:2011-08-06 16:55:39 【问题描述】:

设置:

我有以下代码两个实体模型:

Account,代表用户帐号,有一个外键到教室。

<?php
namespace models;

/**
 * @Entity
 */
class Account

    /**
     * @Id @Column(type="integer")
     * @GeneratedValue(strategy="AUTO")
     */
    public $id;

    /**
     * @OneToOne(targetEntity="Clas-s-room")
     */
    public $clas-s-room;

代表学生注册的教室的教室。

<?php
namespace models;

/**
 * @Entity
 */
class Clas-s-room

    /**
     * @Id @Column(type="integer")
     * @GeneratedValue(strategy="AUTO")
     */
    public $id;

    /**
     * @Column(type="string")
     */
    public $name;

问题:

当我执行$account = $em-&gt;find('Account',$id); 时,我正确地从数据库中取回了帐户,但$account-&gt;clas-s-room; 是一个空(非空)对象。经过一番试验后,我尝试在执行前添加以下命令:

$em->getRepository('Clas-s-room')->findAll().

然后我执行了$em-&gt;find('Account', $id );,并且帐户对象中的教室对象正确返回。

推测:

我认为从数据库加载和缓存实体的方式有问题,因为如果我在执行find() 之前加载所有教室对象(或与我的帐户关联的对象),那么一切没问题。

由于我是 PHP 和 Doctrine 的初学者,我寻求进一步的意见/帮助来解决这个问题。

【问题讨论】:

【参考方案1】:

来自Doctrine Architecture Documentation:

任何实体类的所有持久属性/字段都应始终为privateprotected,否则延迟加载可能无法按预期工作

您的$clas-s-room 属性是public,这可能是与Clas-s-room 实体的关联没有被延迟加载的原因。您应该将其更改为 privateprotected(我建议将所有实体属性设置为 protected,用于 various reasons)。

如果这不起作用,您可以尝试将 OneToOne 关联的 fetch 属性设置为 EAGER,即

/**
 * @OneToOne(targetEntity="Clas-s-room", fetch="EAGER")
 */
protected $clas-s-room;

【讨论】:

以上是关于Doctrine 2 OneToOne 实体映射返回空实体的主要内容,如果未能解决你的问题,请参考以下文章

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

Doctrine 2 OneToOne Identity through foreign Entities Error while persisting

Doctrine 和 SymfonySeoBundle 复制 OneToOne 关系

Symfony2,Doctrine OneToOne 关系

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

为啥在这个 Hibernate 映射中使用 @ManyToOne 而不是 @OneToOne?