继承层次结构中的叶实体是什么,它的例子是什么?
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?也有类似的描述,但是我还没有理解的很清楚,想看看例子。
假设我有实体 V8Engine
、V6Engine
和 Straight4Engine
,它们都扩展了 AbstractEngine
,还有另一个实体 Automobile
,其中许多汽车都有一个引擎(抱歉我虚构的例子,如果你认为有必要改变)。请描述什么是叶实体,并提供目标实体是和不是叶实体的示例。
我认为你在问两个问题:
- 什么是叶实体?
- 如果我使用具有(单一或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的用法。
以下内容由 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?也有类似的描述,但是我还没有理解的很清楚,想看看例子。
假设我有实体 V8Engine
、V6Engine
和 Straight4Engine
,它们都扩展了 AbstractEngine
,还有另一个实体 Automobile
,其中许多汽车都有一个引擎(抱歉我虚构的例子,如果你认为有必要改变)。请描述什么是叶实体,并提供目标实体是和不是叶实体的示例。
我认为你在问两个问题:
- 什么是叶实体?
- 如果我使用具有(单一或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的用法。