3

2 つのテーブルPersonAddressが主キーを共有するようにします。

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です。

それは可能ですか?

4

3 に答える 3