Наследование на уровне таблицы базы данных, стратегия Jpa Joined - PullRequest
0 голосов
/ 05 марта 2012

Я давно работаю с моделью данных.Теперь я считаю, что модель несовершенна, но я не знаю, как ее улучшить.

В основном моя модель домена - - небольшой рекламный сайт для родителей, которые ищут нянек / нянь и детей, которые ищут детей, чтобы ухаживать за ними .

Модель домена в настоящее время имеет базовый класс Account, который разделен на два класса ParentAccount и ChildminderAccount .У меня также есть базовый класс Advertising, который подклассируется тремя ChildminderAdtact , ParentToParentAdvertisment и ParentToChildminderAdtact классов.

Большинство атрибутов являются общими для подклассови поэтому находится в суперклассе.

Чтобы перечислить несколько различий между подклассами:

  • У ChildminderAccount может быть прикреплен учебный план / резюме, а у ParentAccount - нет.
  • ChildminderAccount дополнительно уточняется путем указания, является ли Childminder (универсальный) няней (специфическим) / BabySitter (специфическим) / и т.д.

Это означает, что подкласс ChildminderAccount имеет связи с другими таблицами, которых не имеет подкласс ParentAccount.

В настоящее время наследование реализуется слоем JPA с использованием стратегии Joined (см. JPAдокументация: @Inheritance(strategy=InheritanceType.JOINED)) См. диаграмму. enter image description here

С текущим проектом я столкнулся с рядом проблем:

  • У меня возникают проблемы при выполнении операций, общих для базовых классов.
  • Я часто сталкиваюсь с повторной реализацией методов для подклассов, у меня слишком много DAO.

Как я уже говорил выше, я не уверен, как улучшить дизайн: отказаться ливсе наследование (уровень БД) или стоит ли переходить на другую стратегию наследования ...

Любая подсказка приветствуется.

1 Ответ

0 голосов
/ 05 марта 2012

Что ж, причина, по которой ребята из JPA создали все эти «стратегии наследования», заключается в том, чтобы более тесно имитировать ОО-полиморфизм при работе с таблицами SQL (через сущности JPA). Вы уверены, что пользуетесь этой возможностью?

Например, если вы хотите, чтобы все записи типа учетной записи (независимо от того, являются ли они действительными ParentAccount или ChildminderAccount), вы можете сделать что-то вроде:

SELECT a FROM Account a WHERE ...."
...