¿Cómo gestionar entidades deserializadas con gestor de entidades?

Estoy usando JMSSerializerBundle para serializar mis entidades para json y deserializar json en entidades, pero creo que esta pregunta se aplica a cualquier técnica de deserialización.

Por ejemplo, este esquema:

class Order
{
    private $id;

    /**
     * @Serializer\Type("ArrayCollection<MyBundle\Entity\Order\Item>")
     * @ORM\OneToMany(targetEntity="\MyBundle\Entity\Order\Item", mappedBy="order", cascade={"persist"})
     */
    private $items;
}

class Item
{

    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="\MyBundle\Entity\Order", inversedBy="items")
     */
    private $order;

    /**
     * @var integer $amount
     * @Serializer\Type("integer")
     * @ORM\Column(name="amount", type="integer")
     */
    private $amount;

}

Mapas a este json:{"id":1,"items":[{"id":1,"amount":100}, {"id":2,"amount":200}]} y el mismo json está correctamente deserializado en un objeto de tipoMyBundle: Orden que tiene una coleccion de dosMyBundle: Orden / Artículo objetos.

El problema es que cuando intento persistir este objeto, se crean nuevas entradas en la base de datos, en lugar de actualizar las existentes, ignorando las ID. ¿Cómo le digo al administrador de entidades que estos objetos deberían actualizarse, en lugar de crearlos?

Actualizar. En general, la solución EntityManager :: merge (como lo sugiere DaveM) está bien. Pero solo debes fusionar objetos existentes. Por ejemplo, si tiene un json que representa una nueva entidad de orden que está conectada a las entidades existentes de orden / artículo

{"id": nulo, "elementos": [{"id": 1, "cantidad": 100}, {"id": 2, "cantidad": 200}]}

En este caso, no puede simplemente fusionar un objeto de orden como este:$em->merge($order), porque orden es una nueva entidad y el administrador de entidades intentará encontrar un objeto de pedido con id = null y terminará con un nuevo orden y una matriz de elementos vacíos. Por lo tanto, la solución es hacer un bucle en la matriz Order :: $ items y fusionar cada elemento individualmente. Luego se creará una nueva orden y se conectará con los artículos existentes.

Respuestas a la pregunta(2)

Su respuesta a la pregunta