2013-11-26 2 views
2

В соответствии с конкретным требованием, например, с использованием абстрактного базового класса (или суперкласса), мне нужно реализовать простую иерархию из двух объектов, одна из которых должна распространять другую, но иметь другой собственный @Id.Есть ли способ переопределить идентификатор в подклассе объекта в JPA?

Мой googling об этом, кажется, заключает, что это невозможно или только при условии, что я использую отображаемый суперкласс (который запрещен в моем случае из-за определенной политики).

Я не хочу дублировать код объекта с несколькими десятками атрибутов, а затем мутировать дубликат, добавляя/переопределяя атрибуты, чтобы избежать проблем с будущим обслуживанием, но тогда я застрял в ограничениях JPA.

Любая помощь/предложение будут оценены.

+2

Как должен выглядеть столбец '@ Id' в суперклассе' A' и в подклассе 'B'? Почему бы не использовать делегацию вместо расширения, например 'B' использует' A', вместо 'B' расширяет' A'? –

+0

@AndreiI во многих словах ... точно :) – kostja

+0

@ Аndreil, я не понимаю и/или не знаю, что «B использует A». Любой пример или ссылка будут оценены. – fledglingCoder

ответ

3

Наличие разных типов id для не-абстрактных производных объектов несовместимо с стратегиями наследования JPA.

Что я имею в виду:

Представьте, что вы преуспели, и различные классы в иерархии использования различных несовместимых типов для id.

  • как вы определяете ограничения БД для одного наследования таблицы в таком случае?
  • и для совместного наследования?

EDIT: JPA не делает различия между стратегиями наследования, когда дело доходит до определения идентификатора. И вы даже не можете быть уверены, что можете использовать TABLE_PER_CLASS с чистой JPA. Практически все провайдеры реализуют его, но он указан как необязательный и, следовательно, наименее переносимая стратегия наследования.

Вопрос остается. Как выглядят ограничения БД, чтобы таблица использовалась недвусмысленно поставщиком непрерывности? Например. Какие столбцы должны содержать первичный ключ на уровне БД?

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

Существует несколько возможностей - наименее инвазивным будет композиция, имеющая A как поле в B, эффективно создавая отношение 1-1.

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

tl; dr Нет, это невозможно.

+0

То, что я пытаюсь достичь, - это объект А, имеющий атрибуты, например, int no (как @Id), String def; и Entity B (продолжается A) с длинным идентификатором (@Id), BigDecimal amount, String details, Date date ...В БД таблица A: NO (INTEGER) (PK), DEF (VARCHAR); Таблица B: NO (INTEGER), DEF (VARCHAR), ID (BIGINTEGER) (PK), AMOUNT (DECIMAL), ДЕТАЛИ (VARCHAR), DATE (DATE) и через @Inheritance (strategy = InheritanceType.TABLE_PER_CLASS) – fledglingCoder

+0

@fledglingCoder, к сожалению выбор стратегии наследования не изменяет окончательного ответа. Я отредактировал мой, чтобы отразить это. – kostja

Смежные вопросы