我有一个奇怪的问题,我不认为是正常行为(至少我找不到任何提及它,似乎不正确)。这是我的关联映射:
/**
* @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"
(默认值应该是什么)并没有任何效果。
有没有人知道这里发生了什么?
答案 0 :(得分:3)
哦,这就是原因:
类表继承存在一般性能考虑因素:如果将CTI实体用作多对一或一对一实体,则不应使用继承层次结构上层的其中一个类作为“targetEntity”,只有那些没有子类的。否则,Doctrine不能创建该实体的代理实例,并且总是急切地加载该实体。
http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html