Как EclipseLink называет внешние ключи? - PullRequest
0 голосов
/ 29 октября 2018

Я использую EclipseLink 2.6.2 и Oracle с моим проектом Java. Я хочу понять, как EclipseLink решает назвать внешние ключи.

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

Вот ошибка:

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.2.v20151217-774c696): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: ORA-02264: name already used by an existing constraint
Error Code: 2264
Call: ALTER TABLE publctncompntdef_hist_ref ADD CONSTRAINT pblctncmpntdfbdpckCmpnntDfntnd FOREIGN KEY (bidpackComponentDefinitionId) REFERENCES bidpckcompntdef (bidpackComponentDefinitionId)

Имя внешнего ключа, который он пытается создать: pblctncmpntdfbdpckCmpnntDfntnd

Он пытается создать внешний ключ для таблицы publctncompntdef_hist_ref для таблицы со столбцом bidpackComponentDefinitionId ссылка на таблицу bidpckcompntdef и столбец bidpackComponentDefinitionId9 * Но он уже создал внешний ключ с тем же именем для таблицы publctncompntdefref со столбцом bidpackComponentDefinitionId для таблицы bidpckcompntdef и столбцом bidpackComponentDefinitionId

Я гуглил и так далее, но, похоже, не могу найти документацию по стратегии именования для внешних ключей.

Кроме того, вот значения @JoinTable:

@JoinTable(name = "publctncompntdef_hist_ref",
           joinColumns={@JoinColumn(name="publicationHistoryId",referencedColumnName="id")},
           inverseJoinColumns={@JoinColumn(name="bidpackComponentDefinitionId",referencedColumnName="bidpackComponentDefinitionId")})

@JoinTable(name = "publctncompntdefref",
        joinColumns={@JoinColumn(name="bidpackComponentDefinitionId",referencedColumnName="bidpackComponentDefinitionId")},
        inverseJoinColumns={@JoinColumn(name="publicationId",referencedColumnName="id")})

1 Ответ

0 голосов
/ 29 октября 2018

Думаю, я понял это. Сначала я не осознавал, что EclipseLink является открытым исходным кодом, но, наконец, узнал об этом и загрузил код с: https://github.com/eclipse/eclipselink.runtime

В основном, кажется, это

  1. Удалите префикс FK_, если FK_ + имя таблицы + _ + имя столбца превышает ограничение (30 символов для Oracle).
  2. Если оно все еще слишком длинное, удалите подчеркивание или что-либо еще, кроме буквы или цифры.
  3. Если это все еще слишком долго, удалите гласные
  4. Если это все еще слишком долго:
    4а. Убедитесь, что имя столбца без гласных больше предела (30 символов). Если это так, сделайте имя внешнего ключа только именем столбца минус гласные, укороченные от конца до максимального размера
    4b. Иначе, обрезать имя таблицы, чтобы осталось столько символов (максимальное ограничение - длина имени столбца)

Вот что происходило в моей ситуации:
Имя таблицы = pubctncompntdefref (19 символов) и имя столбца = bidpackcomponentdefinitionid (28 символов)
Минус гласные = pblctncmpntdfrf (15 символов) и bdpckcmpnntdfntnd (17 символов)
Объединение этих двух дает нам 32 символа. Поскольку имя столбца без гласных меньше 30 символов (максимум для оракула), укоротите имя таблицы до (30-17 = 13 символов), что равно pblctncmpntdf. Полное имя внешнего ключа pblctncmpntdfbdpckcmpnntdfntnd.

Точно так же, когда у меня было имя таблицы = publctncompntdef_hist_ref и имя столбца = bidpackcomponentdefinitionid, без гласных я получил pblctncmpntdfhstrf и bdpckcmpnntdfntnd. Имя таблицы состоит из 18 символов, а имя столбца - 17 символов. Следовательно, таблицу необходимо перенести в 13 символов, поэтому pblctncmpntdfhstrf становится pblctncmpntdf, а весь внешний ключ становится pblctncmpntdfbdpckcmpnntdfntnd.

Это объясняет, почему EclipseLink сообщает мне, что с этим именем уже есть ограничение внешнего ключа.

...