我想要两个表,Person
和 Address
,共享它们的主键:
CREATE TABLE Person (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE Address (personId INT UNSIGNED NOT NULL PRIMARY KEY);
我正在尝试模拟这样一种想法,即当您创建一个 Person
时,您也会为其创建一个 Address
。
我想出了以下映射:
class Person
{
/**
* @Id
* @Column(type="integer")
* @GeneratedValue
*/
private $id;
/**
* @OneToOne(targetEntity="Address", cascade={"all"})
* @JoinColumn(name="id", referencedColumnName="personId")
*/
private $address;
public function __construct() {
$this->address = new Address($this);
}
}
class Address
{
/**
* @Id
* @OneToOne(targetEntity="Person")
* @JoinColumn(name="personId", referencedColumnName="id")
*/
private $person;
public function __construct(Person $person) {
$this->person = $person;
}
}
当我尝试保留 Person
时,我希望它级联到 Address
,但出现以下异常:
学说\ORM\ORMException
Entity of type
Address
has identity through a foreign entityPerson
, however this entity has no identity itself. You have to callEntityManager#persist()
on the related entity and make sure that an identifier was generated before trying to persistAddress
. In case of Post Insert ID Generation (such as MySQLAuto-Increment
or PostgreSQLSERIAL
) this means you have to callEntityManager#flush()
between both persist operations.
我不能显式调用 flush()
,因为我没有显式地 persist()
ing Address
,而是期望 Person
级联持久化 Address
。
据我所知,Doctrine 的工作应该是在适当的时候flush()
来获取id
。
当为 Person
和 Address
使用不同的 auto_increment
id 时,这种一对一的关系很好地级联(但是我必须添加addressId
到 Person
)。
我的目标是让它们共享相同的 id
。
这可能吗?
最佳答案
使用如何Identity through foreign Entities在学说 2.1 中?
在您的场景中,您可以使用 @ManyToOne
而不是 @OneToOne
关联。
编辑
当您保留拥有方时,关联也会保留。在您的映射中,即 Address
。更改您的映射,以便所有者拥有外键并且一切正常。
/**
* @OneToOne(targetEntity="Address", cascade={"all"}, inversedBy="person")
* @JoinColumn(name="id", referencedColumnName="personId")
*/
private $address;
换句话说,如果 Address
应该由 Person
拥有,那么您必须首先保留 Address
以保留协会。
如果您希望与 Person
保持关联,则应将 Person
标记为拥有方,并将 Address
标记为 反面:
/**
* @Id
* @OneToOne(targetEntity="Person", inversedBy="address")
* @JoinColumn(name="personId", referencedColumnName="id")
*/
private $person;
关于php - 共享主键的两个表的一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19708898/