Встраиваемый абстрактный класс с JPA (+ Hibernate) - PullRequest
3 голосов
/ 08 августа 2011

Я пытаюсь реализовать эту модель JPA:

  • Класс Owner является Entity. Он имеет @Embedded экземпляр класса AbstractParent.
  • Класс AbstractParent является @Embeddable. Это абстрактный класс, и этот класс имеет двоих детей. Дети - конкретные классы.

Исключение составляет: Cannot instantiate abstract class or interface: AbstractParent

Кажется, что (1) мне нужно наследование компонентов, но (2) наследование компонентов не разрешено в JPA и (3) оно не было реализовано в Hibernate. Не могли бы вы подтвердить, что (1), (2) и (3) являются правильными? Если они правильные, не могли бы вы дать какой-либо совет или обходной путь? Я использую hibernate-jpa 2.0, hibernate-core 3.5.1, hibernate-core-annotations 3.2.0

Ответы [ 2 ]

2 голосов
/ 08 августа 2011

Чтобы ответить на вопросы, почему может понадобиться такая реализация: вот пример. Таблица базы данных содержит информацию о компьютерах, на компьютерах есть мониторы, если монитор имеет ЖК-дисплей, то его параметр равен «пикселям». Если монитор - телевизор, то его параметр - «линии». Все мониторы также имеют параметр «вес» Структура данных этой таблицы включает в себя: id, RAM, monitor_indicator, вес, строки, пиксели.

Эту структуру данных можно реализовать в классах:

  • Класс Computer {id, RAM, display}
    • Имеется информация о компьютерах.
  • Абстрактный класс AbstractDisplay {вес}
    • Имеет общую информацию о дисплеях.
  • Класс LCDDisplay {пикселей} наследует класс AbstractDisplay
    • имеет информацию о ЖК-дисплее (в пикселях).
  • Класс TVDisplay {lines} наследует класс AbstractDisplay
    • он имеет информацию о телевизоре (строки).

Основная идея заключается в том, что основной класс (Владелец / Компьютер) встраивает другой класс (Parent / AbstractDisplay), который может иметь различный набор параметров в зависимости от типа внедренного класса.

Относительно того, как может быть создан экземпляр встроенного абстрактного класса: точно так же, как теперь создается экземпляр абстрактного класса в JPA: в приведенном выше примере «monitor_indicator» указывает на дочерний класс, который должен использоваться, это поле должно существовать в то время, когда класс Computer инстанцирован.

0 голосов
/ 08 августа 2011

Встраивание класса Abstract не имеет никакого логического смысла, его нельзя создать, если оно Abstract. Вам нужно переработать свою логику для , почему вы думаете, что вам нужно встроить класс Abstract, а не конкретную реализацию.

...