2 つのテーブル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ますが、次の例外が発生します。
Doctrine\ORM\ORMException
タイプのエンティティは
Address外部エンティティを介して ID を持ってPersonいますが、このエンティティ自体には ID がありません。関連するエンティティを呼び出しEntityManager#persist()て、永続化を試みる前に識別子が生成されていることを確認する必要がありAddressます。Post Insert ID Generation (MySQLAuto-Incrementや PostgreSQLなど) の場合、これは 、両方の永続化操作の間SERIALに呼び出す必要があることを意味します。EntityManager#flush()
flush()を明示的に呼び出していないため、明示的に呼び出すことはできません。代わりに、 persist をカスケードすることを期待しpersist()てAddressいます。PersonAddress
私が理解している限りflush()では、適切なタイミングでid.
この 1 対 1 の関係は、とauto_incrementの両方に異なる ID を使用すると問題なくカスケードされます (ただし、 toを追加する必要があります)。PersonAddressaddressIdPerson
私の目標は、それらが同じものを共有することidです。
それは可能ですか?