OneToOne 双向关系的错误映射原则

Posted

技术标签:

【中文标题】OneToOne 双向关系的错误映射原则【英文标题】:Error mapping doctrine on OneToOne bidirectional relation 【发布时间】:2016-02-24 17:49:28 【问题描述】:

我正在尝试创建一个与另一个实体 1:1 连接的实体。关键是Equip必须有一个Estadi,而且只有一个。我可以正确更新schema,数据库没问题,但是在网页调试器上出现映射错误。

关联 AppBundle\Entity\Equip#estadi 指的是逆 侧字段 AppBundle\Entity\Estadi#nom 未定义为 协会。

关联 AppBundle\Entity\Equip#estadi 指的是逆 边字段 AppBundle\Entity\Estadi#nom 不存在

这是实体 Estadi:

/**
* @ORM\Entity
* @ORM\Table(name="estadis")
*/

class Estadi
    /**
    * @ORM\Column(type="string",length=30)
    * @ORM\OneToOne(targetEntity="Equip",mappedBy="estadi",cascade="persist")
    * @ORM\Id
    */
    protected $nom;

    /**
    * @ORM\Column(type="integer")
    */
    protected $aforament;

    /**
    * @ORM\Column(type="integer")
    */
    protected $num_portes;

    /**
    * @ORM\Column(type="string",length=50)
    */
    protected $direccio;

    /**
    * @ORM\Column(type="string", length=4)
    */
    protected $any_construccio;

    /**
    * @ORM\Column(type="string", length=30)
    */
    protected $nom_aficio;

这是实体装备:

/**
* @ORM\Entity
* @ORM\Table(name="equips")
*/

class Equip
    /**
    * @ORM\Column(type="string",length=30)      
    * @ORM\Id
    */
    protected $nom;

    /**
    * @ORM\Column(type="integer")
    */
    protected $punts_lliga;

    /**
    * @ORM\Column(type="integer")
    */
    protected $num_jugadors;

    /**
    * @ORM\OneToOne(targetEntity="Estadi",inversedBy="nom")
    * @ORM\JoinColumn(name="nom_estadi",referencedColumnName="nom",onDelete="SET NULL")
    */
    protected $estadi;

    /**
    * @ORM\OneToOne(targetEntity="Entrenador",inversedBy="nom")
    * @ORM\JoinColumn(name="nom_entrenador",referencedColumnName="nom",onDelete="SET NULL")
    */      
    protected $entrenador;

    /**
    * @ORM\ManyToOne(targetEntity="Lliga",inversedBy="equips")
    * @ORM\JoinColumn(name="nom_lliga",referencedColumnName="nom",onDelete="SET NULL")
    */
    protected $lliga;

    /**
    * @ORM\OneToMany(targetEntity="Jugador",mappedBy="nom_equip")
    */
    protected $jugadors;

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

【问题讨论】:

【参考方案1】:

当您定义 @OneToOne 注释时,它不应该在您的主键上。拥有实体应包含单个关联(单向),或者每个实体应包含与另一个实体的关联 - 作为实体,不连接到主键。

您的 Equip 映射应如下所示:

/**
 * @ORM\OneToOne(targetEntity="Estadi", inversedBy="equip")
 * @ORM\JoinColumn(name="nom_estadi", referencedColumnName="nom")
 */
protected $estadi;

public function setEstadi(Estadi $estadi)

    $this->estadi = $estadi;

    return $this;


public function getEstadi()

    return $this->estadi;

您的Estadi 映射应如下所示:

/**
 * @OneToOne(targetEntity="Equip", mappedBy="estadi")
 */
protected $equip;

public function getEquip(Equip $equip)

    return $this->equip;

我删除了 cascadeonDelete,因为如果您通过 Doctrine 处理所有事情,它应该会自动为您处理,但您仍然可以使用它们。我也只按照您描述的方式将设置器放在拥有实体上,但您也可以将其放回您的 Estadi 实体上 - 这取决于您。

【讨论】:

我会试一试,告诉你效果如何!非常感谢!

以上是关于OneToOne 双向关系的错误映射原则的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 findBy($creteria) 进行双向 OneToOne 映射?

学说 oneToOne 单向:获取映射对象

OnetoOne 未知映射者

Hibernate入门之one to one关系映射详解

双向一对一

Hibernate--对象关系