Tengo tres entidades Doctrine: Dispositivo, que tiene una relación OneToOne con Device \ Status, que a su vez tiene una relación OneToOne con Device \ Status \ Battery.Doctrine 2 multinivel OneToOne Cascade
Tengo {cascade = "persist"} establecido entre las entidades relacionadas, y por lo que he leído, debería ser todo lo que se requiere para que Doctrine persista automáticamente en cada una de las entidades sin tener que hacer nada yo mismo en el código.
Aquí es lo que estoy teniendo problemas con:
$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();
Después de ejecutar este código, me sale el siguiente error:
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.
Mi pregunta es: ¿cuál es la forma correcta de configurar mi entidades para asegurarse de que persistan en el orden correcto?
El código para las entidades se puede encontrar aquí: https://gist.github.com/1753524
Todas las pruebas se han realizado utilizando la caja de arena Doctrina 2.2.
Tuve casi el mismo problema. Tienes que llamar a color entre cada persistencia. – CappY
@CappY Según los documentos de Doctrine, dado que tengo {cascade = "persist"} establecido para cada entidad, no es necesario que persista manualmente cada entidad. Este código * debería * funcionar como está. http://readthedocs.org/docs/doctrine-orm/en/latest/reference/working-with-associations.html#transitive-persistence-cascade-operations – Taeram
Proporcione un [ejemplo corto, autónomo, correcto] (http : //sscce.org/). Su código desencadena una violación de acceso al intentar asignar valores directamente a las propiedades 'protected', es decir,' $ device-> id = 100' – Phil