2010-01-14 2 views
6

Я использую JOINED стратегию наследования с реализацией JPA EclipseLink. Я заметил, что EclipseLink добавляет столбец дискриминатора, названный по умолчанию DTYPE, в схему базы данных. Я понимаю, что дискриминатор необходим для одной стратегии наследования таблицы, но почему для стратегии JOINED?Почему EclipseLink добавляет столбец дискриминатора для совместной стратегии наследования?

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

Hibernate основанный JPA не делает ничего подобного.

+0

Возможно, вы сделали ошибку в своем вопросе. Вы говорите, что понимаете, почему, если его СОЕДИНЕННО, но нет, если его СОЕДИНЕН ... – cletus

ответ

1

От Joined Table Inheritance:

В присоединяемой таблице наследовании, каждый класса разделяет данные из корневой таблицы. Кроме того, каждый подкласс определяет свою собственную таблицу , которая добавляет ее расширенное состояние . В следующем примере показаны два таблицы, проект и L_PROJECT, а также как два занятия, проект и LargeProject:

...

колонка дискриминатора является тем, что определяет тип и, таким образом, что присоединилось к таблице для использования, поэтому вам нужен столбец дискриминатора в родительской таблице.

+4

Точно, и это то, что я хочу понять: почему EclipseLink использует этот столбец дискриминатора - это необязательно, стратегия JOINED основана на ассоциации внешних ключей между классы. Спецификация JPA говорит о том, что дискриминатор является необязательным для стратегии JOINED - Hibernate JPA не использует его, например, - и я хотел бы узнать, в чем преимущество его использования, как это делает EclipseLink. –

+0

Думаю, вы имеете в виду http://docs.jboss.org/hibernate/core/3.3/reference/en/html/inheritance.html#inheritance-tablepersubclass. ExlipseLink Я предполагаю, что это просто ясно. Столбец дискриминатора избегает проблемы выполнения EXISTS (или аналогичных) проверок, чтобы найти соответствующий подкласс. Даже если бы это было необязательно, я бы все равно использовал его. – cletus

+0

Это имеет смысл, дискриминатор, безусловно, упрощает реализацию. Спасибо за ответ! –