原则2错误地急切加载多对一关联


Doctrine 2 incorrectly eager loading a many-to-one association?

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

/**
 * @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;
    // ...
}

当我获取一个节点实体使用:

$em->getRepository('Node')->find(1);

Doctrine 急于加载相关的Content实体,没有明显的原因?我知道一对多关联总是渴望加载,但我没想到多对一关联是?

我已经检查了到底发生了什么使用SQL日志,我看到两个单独的查询数据库。我没有OnLoad监听器之类的东西。显式设置fetch="LAZY"(应该是默认值)没有任何效果。

有人知道这是怎么回事吗?

哦,这就是原因:

类表继承有一个一般的性能考虑:如果您使用CTI实体作为多对一或一对一的实体,那么您永远不应该使用继承层次结构上层的一个类作为"targetenentity",只能使用那些没有子类的类。否则Doctrine将无法创建该实体的代理实例,并将始终主动加载该实体。

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