我有一个使用继承的Doctrine实体:
/**
* @ORM\Entity
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="discr", type="string")
* @ORM\DiscriminatorMap({"video" = "Video", "text" = "Text", "image" = "Image" })
* @ORM\Table(name="item_block_content")
* @ORM\HasLifecycleCallbacks
*
* @Serializer\Discriminator(field = "discr", map = {
* "text": "Namespace\To\Entity\Text",
* "video": "Namespace\To\Entity\Video",
* "image": "Namespace\To\Entity\Image"
* })
*/
class Content implements interfaces\Response {
...
}
我还有一个包含内容实体集合的项目实体。当我使用JMSSerializer将这些实体序列化为XML时,我确实看到了一个discrimin列。
<id />
<metadata />
<metadata_technical />
<created>2013-07-01T11:59:50+02:00</created>
<modified>2013-07-01T12:35:51+02:00</modified>
<title>Some title</title>
<text>Some text</text>
<discr>text</discr>
当我想反序列化XML时,除了Content类之外,我得到了预期的结果。它们都是\ Namespace \ To \ Entity \ Content对象。这样我就无法将更改保存到数据库中。
在上面的代码示例中,我已经尝试了 @Discriminator 注释来指定实体类型,但这不起作用。知道我怎么能让这个工作吗?我想我很亲密,但我没有想法。
修改
如果我在父类中进行以下更改:
/**
* @ORM\OneToMany(targetEntity="Namespace\To\Entity\Content", mappedBy="Block", cascade={"persist"})
*
* @Type("ArrayCollection<Namespace\To\Entity\Content>")
*/
到
/**
* @ORM\OneToMany(targetEntity="Namespace\To\Entity\Content", mappedBy="Block", cascade={"persist"})
*
* @Type("ArrayCollection<Namespace\To\Entity\Text>")
*/
我只添加Text元素才能正常工作,但添加其他元素会(ofcourse)中断。
答案 0 :(得分:0)
查看BaseSerializationTest和灯具Vehicle ... @Discriminator
应该完全符合您的目标。
反序列化对象的方式一定有问题。映射正确应用?是否涉及Exlusion Strategy或Groups?