我想要两个表,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
实体类型
Address
通过外部实体具有身份Person
,但是该实体本身没有身份。您必须调用EntityManager#persist()
相关实体并确保在尝试持久之前生成了标识符Address
。在 Post Insert ID Generation(例如 MySQLAuto-Increment
或 PostgreSQLSERIAL
)的情况下,这意味着您必须EntityManager#flush()
在两个持久化操作之间调用。
我不能显式调用flush()
,因为我没有显式persist()
调用,Address
而是希望Person
级联持久化Address
。
所以据我了解,Doctrine 的工作应该是flush()
在适当的时候获得id
.
当为and使用不同auto_increment
的 id时,这种一对一的关系级联很好(但是我必须添加一个to )。Person
Address
addressId
Person
我的目标是让他们共享相同的内容id
。
那可能吗?