9

Doctrine 2 ORM を使用してクラス継承をセットアップしようとしていますが、エラーが発生しています (例に従っている場合でも)。Symfony 2 サンドボックスのコンソールを使用しています。簡単な例では、PersonクラスとEmployeeクラスを使用しています。EmployeePersonを拡張します。

エンティティを生成しようとしたときに発生するエラーは次のとおりです。

[Doctrine\ORM\Mapping\MappingException]

クラス 'Application\MyBundle\Entity\Person' の識別子マップで使用されるエンティティ クラス 'Employee' は存在しません。

試行されている XML は次のとおりです。

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

従業員

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

XML を使用して Doctrine エンティティを構成する人はあまりいないようですが (ほとんどの例では PHP アノテーションを使用しています)、それが最も論理的であると思われるので、適切に行う方法を知りたいと思います。他の誰かがこの問題を抱えているか、解決策を知っていますか?

完全な例外トレースは次のとおりです。

例外トレース:
 () 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
馬力: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
馬力: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() で
C:\SVN\Symfony\symfony-sandbox\src\vendor\symfony\src\Symfony\Bundle\DoctrineBun
dle\Command\GenerateEntitiesDoctrineCommand.php:77
 Symfony\Bundle\DoctrineBundle\Command\GenerateEntitiesDoctrineCommand->execute(
) 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\
アプリ\コンソール:11
4

3 に答える 3

5

同じエラーが発生しました。

私は何をすべきかを考え出した:

あなたの例では、「従業員」エンティティがすでに生成されている必要があります。

  1. Person の継承を削除し、Employee に ID を追加します
  2. 教義:生成:エンティティ
  3. 開始時と同じようにxmlを定義します
  4. 教義:生成:エンティティ

私のために働いた。

于 2011-03-14T09:01:44.350 に答える
2

ディスクリミネータを定義するときは、おそらく完全なクラス名 (名前空間を含む) を使用する必要があります。

お気に入り:

<discriminator-map>
    <discriminator-mapping value="employee" class="Application\MyBundle\Entity\Employee" />
</discriminator-map>
于 2011-02-25T16:13:22.670 に答える
1

ディスクリミネーター マップが適用されるエンティティ クラスと同じ名前空間にクラスが含まれている場合、ディスクリミネーター マップ内のクラスの名前を完全修飾する必要はありません。

6.2. 単一テーブルの継承

于 2011-03-02T15:20:27.640 に答える