我正在使用Doctrine 2和单表继承,我最顶层的实体层次结构是:
JS_File --> [one to many] --> JS_File_Version
然后我的子类实体层次结构是:
JS_Image (extends JS_File) --> [one to many] --> JS_Image_Version (extends JS_File_Version)
继承映射非常适用于JS_File和JS_Image,并且关联映射可以完美地用于JS_File - > JS_File_Version。但是,当谈到在JS_Image上映射“版本”关联时,我得到:
'Property "versions" in "JS_Image" was already declared, but it must be declared only once'
我理解为什么会这样,该关联是从JS_File继承的,我不能覆盖它,但是我如何实现我想要做的事情?基本上,通过继承,我如何告诉Doctrine使用不同的targetEntity
进行子类关联。
答案 0 :(得分:2)
您正在寻找的是JS_Image实体上的@MappedSuperclass注释。
我想我之前使用过它,但根据文档,它允许你“定义多个实体类共有的状态和映射信息”,它也可以 “出现在另外映射的继承层次结构的中间”。
也许您可以使用它来告诉Doctrine将您的JS_Image实体视为子实体的实际“父”实体。现在没有时间对此进行测试,所以如果有帮助请告诉我。
答案 1 :(得分:1)
看起来我正在尝试做的事情是不可能的(将JS_File和JS_Image都作为具体实体)。我已经遵循了教条用户邮件列表中某人的建议:
我解决这个问题的方法是使用抽象基类,然后在子类上定义实际的映射。例如,您可以执行以下操作:
带有子类的JS_AbstractFile:JS_File和JS_Image 带有子类的JS_AbstractVersion:JS_FileVersion和JS_ImageVersion
AbstractFile和AbstractVersion可以定义属性(和getter / setter),但是不应该为该字段定义任何映射信息。然后在您的子类中重新定义属性以及映射信息(至少,这就是我使用注释后我是如何做到的)
http://groups.google.com/group/doctrine-user/msg/243f355191d3a512