返回

InverseBy vs MappedBy:关系注解大剖析,帮你搞懂实体映射

php

InverseBy vs MappedBy:关系注解的剖析

在使用 Zend Framework 2 和 Doctrine 2 开发应用程序时,准确理解 inverseBymappedBy 注解对于创建高效且准确的关系至关重要。这两个注解定义了关联实体之间的关系,帮助框架管理数据库交互和对象图。

什么是 MappedBy?

mappedBy 注解用于指定一个关联关系中拥有一对一或多对一关系中数据库列的实体。换句话说,它指示哪个实体拥有关联实体的引用列。该列通常存储着被映射实体的主键值。

什么是 InverseBy?

inverseBy 注解用于指定关联关系中没有拥有关联实体数据库列的实体。它指示哪个实体反向映射到具有关联列的实体。在一对多或多对多关系中,反向映射的实体通常通过一个集合属性引用拥有关联列的实体。

何时使用 MappedBy 和 InverseBy?

选择使用 mappedByinverseBy 取决于关系的类型:

  • 一对一和多对一关系: 使用 mappedBy 注解。
  • 一对多和多对多关系: 使用 inverseBy 注解。

何时不使用 MappedBy 和 InverseBy?

在以下情况下,不应该使用 mappedByinverseBy 注解:

  • 两个实体都拥有关联实体的数据库列(双向一对一关系)。

示例:

为了更好地理解这些注解,我们考虑以下示例:

// Person.php
/**
 * @Entity
 */
class Person
{
    /**
     * @Id
     * @Column(type="integer")
     * @GeneratedValue
     */
    private $id;

    /**
     * @Column(type="string")
     */
    private $name;

    /**
     * @OneToOne(targetEntity="Customer", mappedBy="person")
     */
    private $customer;
}

// Customer.php
/**
 * @Entity
 */
class Customer
{
    /**
     * @Id
     * @Column(type="integer")
     * @GeneratedValue
     */
    private $id;

    /**
     * @Column(type="string")
     */
    private $address;

    /**
     * @OneToOne(targetEntity="Person", inversedBy="customer")
     */
    private $person;
}

在上面示例中:

  • mappedBy="person" 表示 Customer 实体拥有 personID 列,该列引用 Person 实体的 id 列。
  • inversedBy="customer" 表示 Person 实体反向映射到 Customer 实体。

总结:

  • mappedBy 用于指定拥有关联实体数据库列的实体。
  • inverseBy 用于指定反向映射到拥有关联实体数据库列的实体。
  • 如果两个实体都拥有关联实体的数据库列,则不应使用 mappedByinverseBy

常见问题解答:

  1. 什么是关系注解?
    关系注解是 Doctrine 2 提供的特殊注解,用于定义实体之间的关系。

  2. 除了 mappedByinverseBy 之外,还有哪些关系注解?
    其他关系注解包括 OneToOneManyToOneOneToManyManyToMany

  3. 在何时使用双向一对一关系?
    当两个实体都拥有彼此的引用列时,可以使用双向一对一关系。

  4. mappedByinverseBy 总是成对出现吗?
    是的,在一对多和多对多关系中,mappedByinverseBy 通常成对出现。

  5. 如果不指定 mappedByinverseBy 会发生什么?
    Doctrine 2 将自动创建一个单向关系,该关系由拥有关联实体数据库列的实体拥有。