douzhuolong9886
2012-03-27 16:31
浏览 38
已采纳

Doctrine 2关联继承与不同的类

I'm using Doctrine 2 and single table inheritance, my topmost entity hierarchy is:

JS_File --> [one to many] --> JS_File_Version

And then my sub-class entity hierarchy is:

JS_Image (extends JS_File) --> [one to many] --> JS_Image_Version (extends JS_File_Version)

The inheritance mapping works perfectly for JS_File and JS_Image, and the association mapping works perfectly for JS_File --> JS_File_Version. But, when it comes to map the "versions" association on JS_Image I get:

'Property "versions" in "JS_Image" was already declared, but it must be declared only once'

I understand why this is, the association is being inherited from JS_File and I can't overwrite it, but how do I achieve what I'm trying to do? Basically, with inheritance, how can I tell Doctrine to use a different targetEntity for the sub-classes association.

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • duanji8887 2012-03-29 09:38
    已采纳

    Looks like what I'm trying to do isn't possible (having both JS_File and JS_Image as concrete entities). I've followed the advice of someone from the doctrine-user mailing list instead:

    The way I solved this was to use an abstract base class and then define the actual mappings on the subclasses. For example, you could do something like:

    JS_AbstractFile with subclasses: JS_File and JS_Image JS_AbstractVersion with subclasses: JS_FileVersion and JS_ImageVersion

    AbstractFile and AbstractVersion can define the property (and getter/setters) but you shouldn't define any mapping information for the field. Then in your subclass you re-define the property along with mapping information (at least, thats how I did it since I used annotations)

    http://groups.google.com/group/doctrine-user/msg/243f355191d3a512

    打赏 评论
  • dongzhuang1923 2012-03-28 14:50

    maybe what you are looking for is the @MappedSuperclass annotation on your JS_Image entity.

    I think i used it some time ago, but according to the docs it allows you to "define state and mapping information that is common to multiple entity classes", and it can also "appear in the middle of an otherwise mapped inheritance hierarchy".

    Maybe you can use this to tell Doctrine to see your JS_Image entity as the actual "parent" entity for your subentities. don't have time to test this now though, so please let me know if it helps.

    打赏 评论

相关推荐 更多相似问题