Подтвердить что ты не робот

Могу ли я назвать свои ограничения JPA?

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

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

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

4b9b3361

Ответ 2

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.

Ответ 3

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

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

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

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