Doctrine 2错误地渴望加载多对一关联?

时间:2014-05-06 18:52:58

标签: php doctrine-orm doctrine associations lazy-loading

我有一个奇怪的问题,我不认为是正常行为(至少我找不到任何提及它,似乎不正确)。这是我的关联映射:

/**
 * @ORM\Entity
*/
class Node extends Entity
{
    // ...

    /**
     * @ORM\ManyToOne(targetEntity="\Content", inversedBy="nodes")
     * @ORM\JoinColumn(nullable=true)
     */
    protected $content;

    // ...
}

/**
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="entity_class", type="string")
*/
abstract class Content extends Entity
{  
    // ...

    /**
     * @ORM\OneToMany(targetEntity="\Node", mappedBy="content")
     */
    protected $nodes;

    // ...
}

当我使用:

获取Node实体时
$em->getRepository('Node')->find(1);

Doctrine 急切地加载关联的内容实体,没有明显的原因?我知道一对多的协会总是渴望加载,但我不认为多对一的协会是?

我已经确切地检查了使用SQL记录器发生了什么,我看到了对数据库的两个单独查询。我没有OnLoad听众或类似的东西。明确设置fetch="LAZY"(默认值应该是什么)并没有任何效果。

有没有人知道这里发生了什么?

1 个答案:

答案 0 :(得分:3)

哦,这就是原因:

  

类表继承存在一般性能考虑因素:如果将CTI实体用作多对一或一对一实体,则不应使用继承层次结构上层的其中一个类作为“targetEntity”,只有那些没有子类的。否则,Doctrine不能创建该实体的代理实例,并且总是急切地加载该实体。

http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html