Встраиваемый абстрактный класс с JPA (+Hibernate)
Я пытаюсь реализовать эту модель 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 ответа
Чтобы ответить на вопросы, почему может понадобиться такая реализация: вот пример. Таблица базы данных содержит информацию о компьютерах, на компьютерах есть мониторы, если монитор ЖК-дисплея, то его параметр равен "пикселям". Если монитор - телевизор, тогда его параметр - "линии". Все мониторы также имеют параметр "вес". Структура данных этой таблицы включает в себя: id, RAM, monitor_indicator, вес, строки, пиксели.
Эта структура данных может быть реализована в классах:
- Учебный класс
Computer
{id, RAM, display}- Имеется информация о компьютерах.
- Абстрактный класс
AbstractDisplay
{вес}- Он имеет общую информацию о дисплеях.
- Учебный класс
LCDDisplay
{пиксели} наследуют классAbstractDisplay
- у этого есть специфическая информация LCD (пиксели).
- Учебный класс
TVDisplay
{lines} наследует классAbstractDisplay
- у него есть информация для телевидения (линии).
Основная идея заключается в том, что основной класс (Владелец / Компьютер) встраивает другой класс (Parent/AbstractDisplay), который может иметь различный набор параметров в зависимости от типа встроенного класса.
Относительно того, как может быть создан экземпляр встроенного абстрактного класса: точно так же, как теперь создается экземпляр абстрактного класса в JPA: в приведенном выше примере "monitor_indicator" указывает дочерний класс, который должен использоваться, это поле должно существовать во время создания экземпляра класса Computer.
Встраивание Abstract
класс не имеет никакого логического смысла, его нельзя создать, если он Abstract
, Вам нужно переработать логику того, почему вы считаете нужным Abstract
класс, а не конкретная реализация.