JMS Serializer,Doctrine,Persist反序列化OneToMany

时间:2015-03-05 23:16:22

标签: doctrine-orm deserialization jmsserializerbundle jms-serializer

我正在尝试保存反序列化的OneToMany连接,但是doctrine会将父项($ parent)的id-field留空。

class MyParent
{
    /**
     * @ORM\OneToMany(targetEntity="MyChild", mappedBy="parent", cascade={"persist"})
     *
     * @Serializer\Expose
     * @Serializer\SerializedName("Children")
     * @Serializer\Type("ArrayCollection<MyNamespace\MyChild>")
     * @Serializer\XmlList(entry="Children")
     *
     * @var \Doctrine\Common\Collections\ArrayCollection
     */
    private $children;

}

class MyChild
{
    /**
     * @var MyParent
     *
     * @ORM\ManyToOne(targetEntity="MyParent", inversedBy="children")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
     * })
     */
    private $parent;
}

我正在尝试使用JMS Serializer:

$entity = $serializer->deserialize($myXmlAsString, 'MyNamespace\MyParent', 'xml');
$entityManager->persist($entity);
$entityManager->flush($entity);

结果: 所有数据都保存到数据库中,但子列的parent_id为空!

xml不包含任何ID。无论如何,id都被排除在(de)序列化之外,因为我想忽略它们。

我的配置有什么问题?

1 个答案:

答案 0 :(得分:1)

我认为你应该在坚持之前合并你的实体。

尝试在persist之前添加$entity = $entityManager->merge($entity);并将, "merge"添加到级联选项

  

来自手册@ http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#merging-entities

     

合并实体是指将(通常是分离的)实体合并到EntityManager的上下文中,以便它们再次被管理。要将实体的状态合并到EntityManager,请使用EntityManager#merge($ entity)方法。传递的实体的状态将合并到此实体的托管副本中,随后将返回此副本。

     

示例:

<?php
$detachedEntity = unserialize($serializedEntity); // some detached entity
$entity = $em->merge($detachedEntity);
// $entity now refers to the fully managed copy returned by the merge operation.
// The EntityManager $em now manages the persistence of $entity as usual.
     

如果要序列化/反序列化实体,则必须保护所有实体属性,而不是私有。这样做的原因是,如果您之前序列化一个代理实例的类,则不会序列化私有变量并抛出PHP Notice。