当前位置: 首页 > 知识库问答 >
问题:

第2条原则错误地加载多对一关联?

云宜人
2023-03-14

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

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

条令也会加载相关的内容实体,没有明显的原因吗?我知道一对多的关系总是很紧张,但我不认为多对一关系是这样的吗?

我已经使用SQL logger准确地检查了正在发生的事情,我看到了对数据库的两个单独的查询。我没有在线听众或类似的东西。显式设置fetch=“LAZY”(默认设置)没有任何效果。

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

共有1个答案

越霖
2023-03-14

哦,这就是原因:

类表继承有一个一般的性能考虑:如果将CTI实体作为多对一或一对一实体使用,则永远不要将继承层次结构的上层的一个类作为“targetEntity”,只使用那些没有子类的类。否则,条令无法创建此实体的代理实例,并且将始终急切地加载该实体。

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

 类似资料:
  • 是否可以在每个实体的基础上实施条令2中的自定义水合作用和持久性? 原则2对价值对象(如集合和ID)有一些主要限制。我想知道是否可以使用自定义机制(或实现)将对象属性映射到数据库(加载和持久化)。 我知道有一些可能“解决”这个问题,但我不喜欢其中任何一个: 伪实体需要在实体中正确处理,从而将持久性层泄漏到域对象中 我知道条令中的生命周期事件可能是有用的。我无法确定postLoad事件是否携带一个已经

  • 我有两个对象,分别是和。它们都正确地映射了条令注释和Adresa是一对一的关联。 我可以使用实体管理器分别加载Osoba和Adresa。只要Osoba没有填充属性Adresa,它就可以正常工作。但当我用属性Adresa保存Osoba并试图从数据库检索对象时,抛出了一个错误。 这就是我试图获取对象Osoba的方式。数据库中id为13的Osoba包含指向Adresa表的id。 抛出的错误是 这是我的O

  • 请帮帮我。当我尝试运行sql命令时,会收到以下消息: 我正在尝试实现一种多对多的关系。

  • 我有三个表/实体: > 游戏 网站游戏 地点 我必须在教义2中写查询,这将使所有游戏(作为对象)可用于特定的网站(得到这个特定的网站作为对象)。唯一的关系(多对一)在表/实体SiteGame中,它包含列/对象: 游戏/游戏id 站点/站点id 通常,原始SQL看起来像(并且可以工作): 这是我在教义中尝试过的,但失败了: 错误:路径表达式无效。必须是StateFieldPathExpression

  • 我的问题:当我删除一个项目实体时,它被从Project表中移除,但是这个项目和标记之间的project_tag表中的关系没有被删除。然后,如果我创建了一个新的项目实体,就会抛出一个异常。 实体: 标签 控制器中操作的完整代码:

  • 我在Django中创建了一个数据模型,它具有多对一关系(N个主题对1个用户),如下所示: 来自django。db从django导入模型。contrib。auth。模型导入用户 当我尝试在“管理”页面中加载数据模型时,出现以下错误: 我错过了数据模型中的什么吗? 谢谢。