继承层次结构中的叶实体是什么,它的例子是什么?

What is a leaf entity in the inheritance hierarchy and what are examples of?

以下内容由 Inheritance Mapping - Doctrine 提供,仅修改为适用于 STI 和 CTI。

There is a general performance consideration with Single or Class Table Inheritance (STI or CTI): If the target-entity of a many-to-one or one-to-one association is a STI or CTI entity, it is preferable for performance reasons that it be a leaf entity in the inheritance hierarchy, (ie. have no subclasses). Otherwise Doctrine CANNOT create proxy instances of this entity and will ALWAYS load the entity eagerly.

除了Doctrine docs之外,What is a leaf entity?也有类似的描述,但是我还没有理解的很清楚,想看看例子。

假设我有实体 V8EngineV6EngineStraight4Engine,它们都扩展了 AbstractEngine,还有另一个实体 Automobile,其中许多汽车都有一个引擎(抱歉我虚构的例子,如果你认为有必要改变)。请描述什么是叶实体,并提供目标实体是和不是叶实体的示例。

我认为你在问两个问题:

  1. 什么是叶实体?
  2. 如果我使用具有(单一或Class)Table继承的实体作为目标实体怎么办?

1。什么是叶实体?

假设您有这些 classes:

abstract class AbstractEngine {}
final class V6Engine extends AbstractEngine {}
class V8Engine extends AbstractEngine {}
class AudiV8Engine extends V8Engine {}
  • AbstractEngine 是一个抽象实体,因此不是叶子。
  • V6Engine 是最终的class。它不能有子classes并且是一片叶子。
  • V8Engine 不是最终的并且有一个子class(AudiV8Engine)并且不是叶子。
  • AudiV8Engine不是最终版,但是没有subclasses,也是叶子

请注意 Doctrine 实体 can't be final 所以这可能是他们没有提到 final 这个词的原因。

2。如果我使用 (Single or Class) Table 继承作为目标实体怎么办?

根据文档,如果您与非叶实体有关系,则 Doctrine 无法创建代理实例。这可能会导致性能下降,但这取决于您的情况,这个问题有多大。

在我的一个项目中,我正在使用 Table 继承(组织作为基础 class,具有子classes 客户和供应商)。在大多数情况下,目标实体是客户或供应商,但在某些情况下,目标实体是组织。它是我项目中最重要的实体之一,我没有遇到过性能问题。

所以根据文档和我自己的经验:可以使用Table继承作为目标实体,但是如果性能很重要,重新考虑STI/CTI的用法。