2010-10-14 9 views
7

Estoy intentando configurar la herencia de clases con Doctrine 2 ORM, pero estoy recibiendo errores (incluso cuando sigo sus ejemplos). Estoy usando la consola desde un sandbox de Symfony 2. El ejemplo simple usa las clases Persona y Empleado; Un empleado extiende Persona.Herencia de Doctrine Class en XML

El error que estoy haciendo cuando se trata de generar las entidades es:

 
[Doctrine\ORM\Mapping\MappingException] 

Entity class 'Employee' used in the discriminator map of class 'Application\MyBundle\Entity\Person' does not exist. 

El XML que se trató es el siguiente:

persona

<?xml version="1.0" encoding="utf-8"?> 
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" 
        xsi="http://www.w3.org/2001/XMLSchema-instance" 
        schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"> 

<entity name="Application\MyBundle\Entity\Person" inheritance-type="SINGLE_TABLE"> 
    <change-tracking-policy>DEFERRED_IMPLICIT</change-tracking-policy> 
    <id name="id" type="integer" column="id"> 
     <generator strategy="AUTO"/> 
    </id> 

    <discriminator-column name="discr" type="string" /> 

    <discriminator-map> 
     <discriminator-mapping value="employee" class="Employee" /> 
    </discriminator-map> 

    <lifecycle-callbacks/> 
</entity> 

</doctrine-mapping> 

Empleado

<?xml version="1.0" encoding="utf-8"?> 
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" 
        xsi="http://www.w3.org/2001/XMLSchema-instance" 
        schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"> 

<entity name="Application\MyBundle\Entity\Employee"> 
    <change-tracking-policy>DEFERRED_IMPLICIT</change-tracking-policy> 
    <id name="id" type="integer" column="id"> 
     <generator strategy="AUTO"/> 
    </id> 
    <lifecycle-callbacks/> 
</entity> 

</doctrine-mapping> 

Parece que muchas personas no usan XML para configurar sus entidades Doctrine (la mayoría de los ejemplos usan anotaciones PHP), pero parece ser la más lógica para mí, por lo que me gustaría saber cómo hacerlo correctamente. ¿Alguien más ha tenido este problema o conoce una solución?

Un rastro excepción completa es la siguiente:

 
Exception trace: 
() at C:\SVN\Symfony\symfony-sandbox\src\vendor\doctrine\lib\Doctrine\ORM\Mappi 
ng\MappingException.php:187 
Doctrine\ORM\Mapping\MappingException::invalidClassInDiscriminatorMap() at C:\S 
VN\Symfony\symfony-sandbox\src\vendor\doctrine\lib\Doctrine\ORM\Mapping\ClassMet 
adataInfo.php:1465 
Doctrine\ORM\Mapping\ClassMetadataInfo->setDiscriminatorMap() at C:\SVN\Symfony 
\symfony-sandbox\src\vendor\doctrine\lib\Doctrine\ORM\Mapping\Driver\XmlDriver.p 
hp:98 
Doctrine\ORM\Mapping\Driver\XmlDriver->loadMetadataForClass() at C:\SVN\Symfony 
\symfony-sandbox\src\vendor\doctrine\lib\Doctrine\ORM\Mapping\Driver\DriverChain 
.php:75 
Doctrine\ORM\Mapping\Driver\DriverChain->loadMetadataForClass() at C:\SVN\Symfo 
ny\symfony-sandbox\src\vendor\doctrine\lib\Doctrine\ORM\Mapping\ClassMetadataFac 
tory.php:280 
Doctrine\ORM\Mapping\ClassMetadataFactory->loadMetadata() at C:\SVN\Symfony\sym 
fony-sandbox\src\vendor\doctrine\lib\Doctrine\ORM\Mapping\ClassMetadataFactory.p 
hp:178 
Doctrine\ORM\Mapping\ClassMetadataFactory->getMetadataFor() at C:\SVN\Symfony\s 
ymfony-sandbox\src\vendor\doctrine\lib\Doctrine\ORM\Mapping\ClassMetadataFactory 
.php:125 
Doctrine\ORM\Mapping\ClassMetadataFactory->getAllMetadata() at C:\SVN\Symfony\s 
ymfony-sandbox\src\vendor\symfony\src\Symfony\Bundle\DoctrineBundle\Command\Doct 
rineCommand.php:143 
Symfony\Bundle\DoctrineBundle\Command\DoctrineCommand->getBundleMetadatas() at 
C:\SVN\Symfony\symfony-sandbox\src\vendor\symfony\src\Symfony\Bundle\DoctrineBun 
dle\Command\GenerateEntitiesDoctrineCommand.php:77 
Symfony\Bundle\DoctrineBundle\Command\GenerateEntitiesDoctrineCommand->execute(
) at C:\SVN\Symfony\symfony-sandbox\src\vendor\symfony\src\Symfony\Component\Con 
sole\Command\Command.php:150 
Symfony\Component\Console\Command\Command->run() at C:\SVN\Symfony\symfony-sand 
box\src\vendor\symfony\src\Symfony\Component\Console\Application.php:184 
Symfony\Component\Console\Application->doRun() at C:\SVN\Symfony\symfony-sandbo 
x\src\vendor\symfony\src\Symfony\Bundle\FrameworkBundle\Console\Application.php: 
74 
Symfony\Bundle\FrameworkBundle\Console\Application->doRun() at C:\SVN\Symfony\s 
ymfony-sandbox\src\vendor\symfony\src\Symfony\Component\Console\Application.php: 
113 
Symfony\Component\Console\Application->run() at C:\SVN\Symfony\symfony-sandbox\ 
app\console:11 

Respuesta

2

Probablemente debería utilizar el nombre completo de la clase (con espacios de nombres) al definir el discriminador.

igual:

<discriminator-map> 
    <discriminator-mapping value="employee" class="Application\MyBundle\Entity\Employee" /> 
</discriminator-map> 
0

Los nombres de las clases en el mapa discriminador no tiene por qué ser completo si las clases son contenida en el mismo espacio de nombres como la clase entidad en la que se aplica el mapa del discriminador .

6.2. Single Table Inheritance

5

que tiene el mismo error.

me di cuenta de lo que debe hacer:

En su ejemplo, debe tener la entidad 'Empleado' ya se generó.

  1. quitar herencia en persona y añadir un ID de Empleado
  2. doctrine: generate: entidades
  3. definen los XMLs como estaban al inicio
  4. doctrine: generate: entidades

trabajadas para mi.

+2

Tuve el mismo problema con una configuración similar usando yml. Acabo de eliminar el discriminatorMap, generé las entidades basadas en clases y luego las agregué nuevamente.aunque esto es un poco extraño y probablemente haya una mejor manera de hacerlo. –

+0

¡Muchas gracias! ¡Me salvaste el tiempo! – Jekis

Cuestiones relacionadas