2016-05-02 2 views
0

У меня есть простая схема базы данных с двумя таблицами A и B, которые были смоделированы как объекты, использующие Hibernate. Каждая строка из B имеет внешний ключ, который однозначно идентифицирует строку A.Включение или отключение индексов для внешних ключей с гибернатом

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

Однако по некоторым причинам мне пришлось переключиться на другую базу данных базы данных: HSQLDB. Аннотации JPA для создания моего индекса учитываются, но поскольку HSQLDB создает по умолчанию индекс для всех внешних ключей, у меня в итоге есть 2 индекса для одного и того же столбца.

Я читал, что создание индексов для внешних ключей является специфическим поставщиком базы данных (например, Oracle и Postgres не создают индексы, а MySQL и HSQLDB делают).

Мне интересно, есть ли способ включить/отключить создание индексов для внешних ключей независимо от того, что провайдер? в противном случае похоже, что мне приходится справляться с двойной индексацией.

Любая идея, комментарий, предложение приветствуются.

ответ

1

Я в аналогичной ситуации, наш продукт должен поддерживать различные rdbms (firebird, mssql, oracle, db2). мы просто создаем индексы для всех внешних ключей для всех rdbms. для больших проектов также неплохо не полагаться на функцию hibmates hbm2ddl для настройки базы данных. такие решения, как flyway или Liquibase, предлагают больше контроля над вашим ddl (хотя и ценой дополнительного кода, который вы должны писать и поддерживать).

1

Вы не можете изменить это в HSQLDB ... если вы не хотите загружать исходный код и настраивать его самостоятельно.

От HSQLDB docs:

HSQLDB создает индексы внутри для поддержки PRIMARY KEY, UNIQUE и FOREIGN KEY ограничения: уникальный индекс создается для каждого PRIMARY KEY или UNIQUE ограничения; для каждого ограничения FOREIGN KEY создается обычный индекс. Из-за этого вам не следует создавать повторяющиеся определяемые пользователем индексы в тех же наборах столбцов, на которые распространяются эти ограничения.

+0

Благодарим вас за ответ. Это моя проблема. Интересно, есть ли способ настроить его на уровне Hibernate, по крайней мере, чтобы избежать двух индексов для одного столбца. К сожалению, на основе _lumue_ ответа, похоже, что это невозможно. – Laurent

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