2010-10-14 8 views
7

में सिद्धांत वर्ग विरासत मैं सिद्धांत 2 ओआरएम का उपयोग कर कक्षा विरासत स्थापित करने की कोशिश कर रहा हूं, लेकिन त्रुटियां प्राप्त कर रहा हूं (यहां तक ​​कि उनके उदाहरणों का पालन करते समय भी)। मैं एक सिम्फनी 2 सैंडबॉक्स से कंसोल का उपयोग कर रहा हूँ। सरल उदाहरण कक्षाओं का उपयोग करता है व्यक्ति और कर्मचारी; एक कर्मचारीव्यक्ति बढ़ाता है।एक्सएमएल

त्रुटि मैं जब संस्थाओं उत्पन्न करने के लिए कोशिश कर रहा हो रही है:

 
[Doctrine\ORM\Mapping\MappingException] 

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

एक्सएमएल मुकदमा चल रहा नीचे है:

व्यक्ति

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

ऐसा लगता है कि कई लोग अपने सिद्धांत इकाइयों को कॉन्फ़िगर करने के लिए एक्सएमएल का उपयोग नहीं करते हैं (अधिकांश उदाहरण PHP एनोटेशन का उपयोग कर रहे हैं), लेकिन यह मेरे लिए सबसे तार्किक लगता है इसलिए मैं जानना चाहता हूं कि इसे ठीक से कैसे किया जाए। क्या किसी और को यह समस्या है, या समाधान के बारे में पता है?

 
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 

उत्तर

2

आप शायद (नामस्थान के साथ) पूर्ण वर्ग के नाम का उपयोग करना चाहिए जब discriminator को परिभाषित:

एक पूर्ण अपवाद का पता लगाने के रूप में निम्नानुसार है।

तरह:

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

discriminator मानचित्र में कक्षाओं के नाम पूरी तरह से योग्य होने के लिए करता है, तो कक्षाएं इकाई वर्ग के रूप में एक ही नाम स्थान में निहित हैं की जरूरत नहीं है, जिस पर भेदभावकर्ता मानचित्र लागू किया गया है।

6.2. Single Table Inheritance

5

मैं एक ही त्रुटि मिली।

मैं पता लगा कि क्या करना है:

अपने उदाहरण में, आप 'कर्मचारी' इकाई पहले से उत्पन्न होना आवश्यक है। व्यक्ति में

  1. निकालें विरासत और
  2. सिद्धांत कर्मचारी में एक आईडी जोड़ें: उत्पन्न: संस्थाओं
  3. xmls के रूप में वे शुरू में थे
  4. सिद्धांत निर्धारित किए हैं: उत्पन्न: संस्थाओं

काम किया मेरे लिए।

+2

मुझे yml का उपयोग कर एक समान कॉन्फ़िगरेशन के साथ एक ही समस्या थी। मैंने सिर्फ भेदभावकर्ता मानचित्र को हटा दिया, कक्षा आधारित इकाइयों को उत्पन्न किया और फिर इसे वापस जोड़ा।हालांकि यह थोड़ा अजीब है और ऐसा करने का शायद एक बेहतर तरीका है। –

+0

बहुत बहुत धन्यवाद! आपने मेरा समय बचाया! – Jekis