Лучшие практики для полиморфных JPA через аннотации - PullRequest
6 голосов
/ 09 августа 2010

Я пытаюсь настроить полиморфное поведение, используя Hibernate с аннотациями JPA.

Представляется целесообразным (возможно, даже необходимым) создать (абстрактный) класс, инкапсулирующий состояние и поведения, необходимые для иерархии наследования, чтобыучаствовать в настойчивости;например,

  • Мне нужно аннотировать свойство Id, которое я не могу сделать в интерфейсе без обнародования поля, чтобы избежать исключения «Не указан идентификатор в Entity» в суперклассе
  • Мне нужны подклассы для предоставления DiscriminatorValue, если я использую подход иерархии таблиц для классов

Является ли наследование от абстрактного класса, связанного с персистентностью, хорошей или плохой практикой?Какие плюсы / минусы?Существуют ли лучшие методы обработки наследования в JPA?

1 Ответ

7 голосов
/ 10 августа 2010

Я не уверен, что есть абсолютный ответ на ваши вопросы, это действительно зависит от вашей конкретной ситуации и того, что вы хотите представить с точки зрения ОО.Предоставление некоторого примера, вероятно, поможет.

Но я подозреваю, что вы можете прочитать о Mapped Superclasses .Вот небольшая выдержка из спецификации JPA:

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

Сопоставленный суперкласс, в отличие от сущности, не может запрашиваться и не может быть передан в качестве аргумента EntityManager или Query операций.Сопоставленный суперкласс не может быть целью постоянных отношений.

Как абстрактные, так и конкретные классы могут быть указаны как сопоставленные суперклассы.MappedSuperclass аннотация (или mapped-superclass элемент XML-дескриптора) используется для обозначения сопоставленного суперкласса.

Для класса, обозначенного как MappedSuperclass, для него не определена отдельная таблица.Его информация о сопоставлении применяется к объектам, которые наследуются от него.

И я думаю, что вам также следует прочитать о различных стратегиях наследования для представления наследования на уровне базы данных (одна таблица на иерархию классов, таблицадля каждого конкретного класса, объединенного подкласса), поддерживаемого JPA, поскольку они не обеспечивают одинаковый уровень поддержки полиморфных запросов.Спецификация JPA охватывает это прилично.

Ниже соответствующие ссылки.

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...