我有一个奇怪的问题,我不认为是正常的行为(至少我找不到任何提及它,这似乎是不正确的)。这是我的关联映射:
/**
* @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"
(应该是默认值)没有任何效果。
有人知道这是怎么回事吗?
哦,这就是原因:
http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html类表继承有一个一般的性能考虑:如果您使用CTI实体作为多对一或一对一的实体,那么您永远不应该使用继承层次结构上层的一个类作为"targetenentity",只能使用那些没有子类的类。否则Doctrine将无法创建该实体的代理实例,并将始终主动加载该实体。