我想要两个表,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 )。PersonAddressaddressIdPerson
我的目标是让他们共享相同的内容id。
那可能吗?