Symfony2 映射一对多多音

Posted

技术标签:

【中文标题】Symfony2 映射一对多多音【英文标题】:Symfony2 mapping onetomany manytone 【发布时间】:2012-03-12 12:22:24 【问题描述】:

我正在使用 symfony2 开发一个应用程序,并使用 orm.yml 文件将实体映射到数据库中。当试图为共享单对多关系的两个实体(Anotatzea.php 和 Dokumentua.php)创建数据库表时,就会出现问题。运行php app/console doctrine:schema:update --force 时会显示下一个错误

[RuntimeException]                                                                                                                                                                                                                                                                           
  The autoloader expected class "Anotatzailea\AnotatzaileaBundle\Entity\Anotatzea" to be defined in file "/var/www/Symfony/app/../src/Anotatzailea/AnotatzaileaBundle/Entity/Anotatzea.php". The file was found but the class was not in it, the class name or namespace probably has a typo. 

实体的代码如下:

<?php

namespace Anotatzailea\AnotatzaileaBundle\Entity;

use Symfony\Component\Validator\Mapping\ClassMetadata;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * Anotatzailea\AnotatzaileaBundle\Entity\Dokumentua
 *
 * @ORM\Table(name="Dokumentua")
 * @ORM\Entity
 */
class Dokumentua

    /**
     * @var integer $DokId
     *
     * @ORM\Column(name="DokId", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $DokId;

    /**
     * @var string $Izenburua
     *
     * @ORM\Column(name="Izenburua", type="string", length=30)
     */
    private $Izenburua;

    /**
     * @var string $Egilea
     *
     * @ORM\Column(name="Egilea", type="string", length=40)
     */
    private $Egilea;

    /**
     * @var date $ErregistroData
     *
     * @ORM\Column(name="ErregistroData", type="date")
     */
    private $ErregistroData;

    /**
     * @var boolean $DokEgoera
     *
     * @ORM\Column(name="DokEgoera", type="boolean")
     */
    private $DokEgoera;

    /**
     * @ORM\OneToMany(targetEntity="Anotatzea", mappedBy="Dokumentua")
     */
    protected $Anotatzeak;

    /**
     * Get DokId
     *
     * @return integer 
     */
    public function getDokId()
    
        return $this->DokId;
    

    /**
     * Set Izenburua
     *
     * @param string $izenburua
     */
    public function setIzenburua($izenburua)
    
        $this->Izenburua = $izenburua;
    

    /**
     * Get Izenburua
     *
     * @return string 
     */
    public function getIzenburua()
    
        return $this->Izenburua;
    

    /**
     * Set Egilea
     *
     * @param string $egilea
     */
    public function setEgilea($egilea)
    
        $this->Egilea = $egilea;
    

    /**
     * Get Egilea
     *
     * @return string 
     */
    public function getEgilea()
    
        return $this->Egilea;
    

    /**
     * Set ErregistroData
     *
     * @param date $erregistroData
     */
    public function setErregistroData($erregistroData)
    
        $this->ErregistroData = $erregistroData;
    

    /**
     * Get ErregistroData
     *
     * @return date 
     */
    public function getErregistroData()
    
        return $this->ErregistroData;
    

    /**
     * Set DokEgoera
     *
     * @param boolean $dokEgoera
     */
    public function setDokEgoera($dokEgoera)
    
        $this->DokEgoera = $dokEgoera;
    

    /**
     * Get DokEgoera
     *
     * @return boolean 
     */
    public function getDokEgoera()
    
        return $this->DokEgoera;
    

    public function __construct()
    
        $this->Anotatzeak = new ArrayCollection();
    


<?php

namespace Anotatzailea\AnotatzaileaBundle\Anotatzea;

use Symfony\Component\Validator\Mapping\ClassMetadata;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * Anotatzailea\AnotatzaileaBundle\Entity\Anotatzea
 *
 * @ORM\Table(name="Anotatzea")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class Anotatzea

    /**
     * @var integer $AnotId
     *
     * @ORM\Column(name="AnotId", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $AnotId;

    /**
     * @ORM\ManyToOne(targetEntity="Dokumentua", inversedBy="Anotatzeak")
     * @ORM\JoinColumn(name="DokId", referencedColumnName="DokId")
     */
    protected $Dokumentua;

    /**
     * Get AnotId
     *
     * @return integer 
     */
    public function getAnotId()
    
        return $this->AnotId;
    

    /**
     * Set Dokumentua
     *
     * @param Anotatzailea\AnotatzaileaBundle\Entity\Dokumentua $dokumentua
     */
    public function setDokumentua(\Anotatzailea\AnotatzaileaBundle\Entity\Dokumentua $dokumentua)
    
        $this->Dokumentua = $dokumentua;
    

    /**
     * Get Dokumentua
     *
     * @return Anotatzailea\AnotatzaileaBundle\Entity\Dokumentua 
     */
    public function getDokumentua()
    
        return $this->Dokumentua;
    
    /**
     * @ORM\prePersist
     */
    public function setUpdatedValue()
    
        // Add your code here
    

还有 orm.yml 文件:

Anotatzailea\AnotatzaileaBundle\Entity\Dokumentua:
  type: entity
  table: Dokumentua
  fields:
    DokId:
      type: integer
      id: true
      precision: 0
      scale: 0
      unique: false
      nullable: false
      generator:
        strategy: IDENTITY
    Izenburua:
      type: string
      length: 30
      precision: 0
      scale: 0
      unique: false
      nullable: false
    Egilea:
      type: string
      length: 40
      precision: 0
      scale: 0
      unique: false
      nullable: false
    ErregistroData:
      type: date
      precision: 0
      scale: 0
      unique: false
      nullable: false
    DokEgoera:
      type: boolean
      precision: 0
      scale: 0
      unique: false
      nullable: false
  OneToMany:
    Anotatzeak:
      targetEntity: Anotatzailea\AnotatzaileaBundle\Entity\Anotatzea
      cascade:   
      mappedBy: Dokumentua
      inversedBy: null
      orphanRemoval: false
      cascade: ["persist", "merge","remove"]
      orderBy: null
  lifecycleCallbacks:   

Anotatzailea\AnotatzaileaBundle\Entity\Anotatzea:
  type: entity
  table: Anotatzea
  fields:
    AnotId:
      type: integer
      id: true
      precision: 0
      scale: 0
      unique: false
      nullable: false
      generator:
        strategy: IDENTITY
  manyToOne:
    Dokumentua:
      targetEntity: Anotatzailea\AnotatzaileaBundle\Entity\Dokumentua
      cascade:   
      mappedBy: null
      inversedBy: Anotatzeak
      joinColumns:
        DokId:
          referencedColumnName: DokId
      orphanRemoval: false
  lifecycleCallbacks:  

【问题讨论】:

【参考方案1】:

第二个实体文件中的命名空间名称错误。

替换:

namespace Anotatzailea\AnotatzaileaBundle\Anotatzea;

与:

namespace Anotatzailea\AnotatzaileaBundle\Entity;

【讨论】:

以上是关于Symfony2 映射一对多多音的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate映射( 多对一对一对多多对多)的配置方法

Mybatis复杂映射开发:一对一一对多多对多查询

总结一下数据库的 一对多多对一对多对多 关系

Mybatis之关联关系(一对多多对多)

数据库设计(一对一对多多对多)

数据库设计(一对一一对多多对多)