Могу ли я назвать свои ограничения с JPA? - PullRequest
21 голосов
/ 03 июля 2010

Когда я использую maven-hibernate3-plugin (он же hbm2ddl) для генерации схемы базы данных, он создает множество ограничений базы данных с ужасно трудно запоминающимися именами ограничений, такими как FK7770538AEE7BC70.

Есть ли какие-либоспособ предоставить более полезное имя, такое как FOO_FK_BAR_ID?

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

Ответы [ 3 ]

20 голосов
/ 18 ноября 2014

Начиная с JPA 2.1, можно дать имя внешнему ключу. Э.Г.

@ManyToOne
@JoinColumn(foreignKey=@ForeignKey(name="MY_FANCY_FK_NAME"))
Account account;

Просто убедитесь, что он используется в @JoinColumn. JavaDoc: https://docs.oracle.com/javaee/7/api/javax/persistence/ForeignKey.html#name%28%29

15 голосов
/ 03 июля 2010

Hibernate имеет аннотацию @ForeignKey, позволяющую переопределить имя ограничения.Из справочной документации:

2.4.6.Связанные с коллекцией аннотации

(...)

Ограничения внешнего ключа, генерируемые Hibernate, имеют довольно нечитаемое имя.Вы можете переопределить имя ограничения, используя @ForeignKey.Обратите внимание, что эта аннотация должна быть размещена на стороне-владельце отношения, inverseName ссылаясь на ограничение другой стороны.

@Entity
public class Woman {
    ...
    @ManyToMany(cascade = {CascadeType.ALL})
    @ForeignKey(name = "TO_WOMAN_FK", inverseName = "TO_MAN_FK")
    public Set<Man> getMens() {
        return mens;
    }
}

alter table Man_Woman add constraint TO_WOMAN_FK foreign key (woman_id) references Woman
alter table Man_Woman add constraint TO_MAN_FK foreign key (man_id) references Man

Но я не знаю стандартного эквивалента JPA.

0 голосов
/ 11 декабря 2016

Обычно в корпоративном стеке администраторы баз данных не разрешают и не должны разрешать создание системных объектов в своей базе данных. Обычно они запрашивают, чтобы DDL были вставлены вручную, и вы установите ddl-auto приложений Hibernate в режим update , а не в режим создания или создания-отбрасывания. Это идеальный сценарий для большинства брендов, с которыми я работал. Сказав это, вы можете позволить администратору БД решить переименовать ограничения через операторы alter-table, которые Hibernate сгенерирует для вас. Кроме того, имена ограничений первичного ключа также будут управляться администраторами баз данных после передачи им DDL таблицы создания.

Если вы находитесь в роли полного стека, где решаете все, вы можете изменить имя внешнего ключа только в текущих выпусках, используя аннотацию @ForeignKey.

Но я все равно рекомендовал бы ручную вставку операторов DDL в вашу базу данных вместо того, чтобы позволить системному процессу взять на себя управление, поскольку поддержание базы данных и ее фрагментирование упрощается, если применяется архитектура DBA вручную.

Надеюсь, это ответит на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...