InverseBy vs MappedBy:关系注解大剖析,帮你搞懂实体映射
2024-03-03 03:53:15
InverseBy vs MappedBy:关系注解的剖析
在使用 Zend Framework 2 和 Doctrine 2 开发应用程序时,准确理解 inverseBy
和 mappedBy
注解对于创建高效且准确的关系至关重要。这两个注解定义了关联实体之间的关系,帮助框架管理数据库交互和对象图。
什么是 MappedBy?
mappedBy
注解用于指定一个关联关系中拥有一对一或多对一关系中数据库列的实体。换句话说,它指示哪个实体拥有关联实体的引用列。该列通常存储着被映射实体的主键值。
什么是 InverseBy?
inverseBy
注解用于指定关联关系中没有拥有关联实体数据库列的实体。它指示哪个实体反向映射到具有关联列的实体。在一对多或多对多关系中,反向映射的实体通常通过一个集合属性引用拥有关联列的实体。
何时使用 MappedBy 和 InverseBy?
选择使用 mappedBy
或 inverseBy
取决于关系的类型:
- 一对一和多对一关系: 使用
mappedBy
注解。 - 一对多和多对多关系: 使用
inverseBy
注解。
何时不使用 MappedBy 和 InverseBy?
在以下情况下,不应该使用 mappedBy
或 inverseBy
注解:
- 两个实体都拥有关联实体的数据库列(双向一对一关系)。
示例:
为了更好地理解这些注解,我们考虑以下示例:
// 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
用于指定反向映射到拥有关联实体数据库列的实体。- 如果两个实体都拥有关联实体的数据库列,则不应使用
mappedBy
或inverseBy
。
常见问题解答:
-
什么是关系注解?
关系注解是 Doctrine 2 提供的特殊注解,用于定义实体之间的关系。 -
除了
mappedBy
和inverseBy
之外,还有哪些关系注解?
其他关系注解包括OneToOne
、ManyToOne
、OneToMany
和ManyToMany
。 -
在何时使用双向一对一关系?
当两个实体都拥有彼此的引用列时,可以使用双向一对一关系。 -
mappedBy
和inverseBy
总是成对出现吗?
是的,在一对多和多对多关系中,mappedBy
和inverseBy
通常成对出现。 -
如果不指定
mappedBy
或inverseBy
会发生什么?
Doctrine 2 将自动创建一个单向关系,该关系由拥有关联实体数据库列的实体拥有。