Наследование ассоциации Doctrine 2 с разными классами

Я использую 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 для ассоциации подклассов.


person Jack Sleight    schedule 27.03.2012    source источник


Ответы (2)


возможно, вы ищете @MappedSuperclass в аннотации вашего объекта JS_Image.

Кажется, я использовал его некоторое время назад, но, согласно документации, он позволяет вам "определять информацию о состоянии и отображении, общую для нескольких классов сущностей", а также может "отображаться в середина иначе отображаемой иерархии наследования".

Возможно, вы можете использовать это, чтобы сообщить Doctrine, что ваш объект JS_Image является фактическим «родительским» объектом для ваших подсущностей. сейчас нет времени проверить это, поэтому, пожалуйста, дайте мне знать, если это поможет.

person jere    schedule 28.03.2012
comment
Спасибо за совет, похоже, то, что я пытался сделать, невозможно. Я выбрал другой подход (см. Другой ответ), который, я думаю, похож на этот. - person Jack Sleight; 29.03.2012

Похоже, то, что я пытаюсь сделать, невозможно (имея JS_File и JS_Image как конкретные объекты). Вместо этого я последовал совету кого-то из списка рассылки доктрины-пользователя:

Я решил эту проблему, используя абстрактный базовый класс, а затем определяя фактические сопоставления в подклассах. Например, вы можете сделать что-то вроде:

JS_AbstractFile с подклассами: JS_File и JS_Image JS_AbstractVersion с подклассами: JS_FileVersion и JS_ImageVersion

AbstractFile и AbstractVersion могут определять свойство (и геттеры/сеттеры), но вы не должны определять какую-либо информацию о сопоставлении для поля. Затем в своем подклассе вы переопределяете свойство вместе с информацией о сопоставлении (по крайней мере, так я это сделал, так как использовал аннотации)

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

person Jack Sleight    schedule 29.03.2012