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
います。Person
Address
私が理解している限りflush()
では、適切なタイミングでid
.
この 1 対 1 の関係は、とauto_increment
の両方に異なる ID を使用すると問題なくカスケードされます (ただし、 toを追加する必要があります)。Person
Address
addressId
Person
私の目標は、それらが同じものを共有することid
です。
それは可能ですか?