私は3つのDoctrineエンティティを持っています:デバイスはDevice \ StatusとOneToOneの関係を持ち、Device \ Status \ BatteryとOneToOneの関係にあります。Doctrine 2マルチレベルOneToOneカスケード
関連するエンティティと、私が読んだものの間に{cascade = "persist"}を設定しました。Doctrineが自分で何もしなくてもそれぞれのエンティティを自動的に保持するために必要ですコード。ここで
は私がに問題あるんだよ:このコードを実行した後
$device = new \Entities\Device();
$device->setId(100);
$status = $device->getStatus();
$status->setIpAddress('192.168.0.1');
$battery = $status->getBattery();
$battery->setInternalLevel(60);
$em->persist($device);
$em->flush();
を、私は次のエラーを取得する:
Entity of type Device\Status\Battery has identity through a foreign entity
Device\Status, however this entity has no identity itself. You have to call
EntityManager#persist() on the related entity and make sure that an identifier
was generated before trying to persist 'Device\Status\Battery'. In case of
Post Insert ID Generation (such as MySQL Auto-Increment or PostgreSQL SERIAL)
this means you have to call EntityManager#flush() between both persist
operations.
私の質問は:セットアップへの正しい方法は、私のものですエンティティが正しい順序で永続化されていることを確認しますか?
エンティティのためのコードはここで見つけることができます:https://gist.github.com/1753524
すべてのテストは、教義2.2サンドボックスを使用して行われてきました。
私はほとんど同じ問題を抱えていました。 Uはそれぞれの持続の間にフラッシュする必要があります。 – CappY
@CappY Doctrineの文書によると、{cascade = "persist"}が各エンティティに設定されているので、各エンティティを手動で永続化する必要はありません。このコード*はそのまま動作するはずです。 http://readthedocs.org/docs/doctrine-orm/en/latest/reference/working-with-associations.html#transitive-persistence-cascade-operations – Taeram
[短い、自己完結型の、正しい例](http ://sscce.org/)。あなたのコードは 'protected 'プロパティに直接値を代入しようとすると、アクセス違反を引き起こします。' $ device-> id = 100' – Phil