2010-10-14 4 views
7

J'essaye de configurer l'héritage de classe en utilisant l'ORM de Doctrine 2, mais je reçois des erreurs (même en suivant leurs exemples). J'utilise la console depuis un bac à sable Symfony 2. L'exemple simple utilise les classes Personne et Employé; Un employé s'étend Personne.Doctrine Class Inheritance in XML

L'erreur que je reçois en essayant de générer les entités est:

 
[Doctrine\ORM\Mapping\MappingException] 

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

Le XML est jugé ci-dessous:

Personne

<?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> 

employé

<?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> 

Il ne semble pas que beaucoup de gens utilisent XML pour configurer leurs entités Doctrine (la plupart des exemples utilisent des annotations PHP), mais cela me semble le plus logique, donc j'aimerais savoir comment le faire correctement. Est-ce que quelqu'un d'autre a eu ce problème, ou connaît une solution?

Une trace complète d'exception est la suivante:

 
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 

Répondre

2

Vous devriez probablement utiliser le nom complet de la classe (avec namespaces) lors de la définition du discriminateur.

Comme:

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

Les noms des classes dans la carte discriminateur ne doit pas être pleinement qualifié si les classes sont contenues dans le même espace que la classe d'entité sur laquelle la carte discriminante est appliquée.

6.2. Single Table Inheritance

5

j'ai eu la même erreur.

Je compris ce qu'il faut faire:

Dans votre exemple, vous devez avoir l'entité « employé » déjà généré.

  1. supprimer l'héritage en personne et ajouter un id dans l'employé
  2. doctrine: generate: entités
  3. définissent les xmls comme ils étaient au début
  4. doctrine: generate: entités

Travaillé pour moi.

+2

J'ai eu le même problème avec une configuration similaire utilisant yml. Je viens de supprimer discriminatorMap, j'ai généré les entités basées sur la classe, puis je l'ai rajouté.Bien que ce soit un peu étrange et il y a probablement une meilleure façon de le faire. –

+0

Merci beaucoup! Tu as sauvé mon temps! – Jekis