在扩展另一个实体中使用鉴别器

Posted

技术标签:

【中文标题】在扩展另一个实体中使用鉴别器【英文标题】:Using discriminator in a entity that extends another 【发布时间】:2014-11-20 20:36:27 【问题描述】:

我正在尝试在从另一个扩展的实体中使用Discriminator。这是我制作的代码:

/**
 * @ORM\Entity
 * @ORM\Table(name="usuarios_externos.usuarios", schema="usuarios_externos")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap(
 *     "natural" = "Natural",
 *     "empresa" = "Empresa"
 * )
 * @UniqueEntity(fields="correo_alternativo", message="El correo electrónico ya está siendo usado.")
 * @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false)
 */
class Usuario extends BaseUser 
    ....

但是我在运行命令doctrine:schema:validate时遇到了这个错误:

[Doctrine\ORM\Mapping\MappingException] 实体 'UsuarioBundle\Entity\Usuario' 必须是鉴别器映射的一部分 'UsuarioBundle\Entity\Usuario' 被正确映射到 继承层次结构。或者,您可以制作 'UsuarioBundle\Entity\Usuario' 一个抽象类来避免这种情况 发生异常。

有什么办法可以解决这个问题吗?可以在扩展类中使用鉴别器吗?

【问题讨论】:

【参考方案1】:

答案就在warning 消息中!

基本上,它告诉您Usuario 的定义方式可能会导致麻烦。在其当前形式中,此代码允许您创建 Usuario 的实例并使用它。但请稍等。这在鉴别器图中没有定义。那么,当你试图坚持它时会发生什么? 轰隆隆!...或者至少它会抛出一个丑陋的异常。

现在,我知道您可能甚至没有考虑过实例化 Usuario。它只是NaturalEmpresa 的基类,但Doctrine 不知道这一点

那么,你该如何解决呢?根据您的需要,有两种可能的情况:

Usuario 应该是可实例化的

也就是说,您的应用程序中的用户可以是NaturalEmpresa 或只是普通Usuario 的实例。情况可能并非如此,但它可能适用于未来的读者。

解决方案:Usuario 添加到鉴别器映射中。这将使您的用户成为这三种类型中的任何一种。

 * ...
 * @ORM\DiscriminatorMap(
 *     "usuario" = "Usuario",
 *     "natural" = "Natural",
 *     "empresa" = "Empresa"
 * )
 * ...

Usuario 应该是可实例化的

也就是说,您的应用程序中的用户可以是NaturalEmpresa 的实例,但不能是Usuario

解决方案:Usuario 设为 abstract 类。这将使它无法被实例化。

abstract class Usuario extends BaseUser 
    ...

【讨论】:

很好的答案。救了我。谢谢!

以上是关于在扩展另一个实体中使用鉴别器的主要内容,如果未能解决你的问题,请参考以下文章

鉴别器图中缺少的实体

我可以删除 Hibernate 单表继承中的鉴别器列吗?

Symfony2:字段或鉴别器列映射中实体上列“id”的重复定义

EF- '' 和 '' 都映射到表 ''。层次结构中没有鉴别器的所有实体类型必须映射到不同的表

如何在meanjs中扩展userShema

鉴别器