Я разрабатываю приложение, использующее JPA 2.1 с Hibernate 4.3 в качестве поставщика сохранения.Почему определение внешнего ключа JPA (Hibernate) на @JoinTable не работает?
Для обеспечения удобочитаемости и улучшения обслуживания я хочу явно называть все возможные мысли и не полагаться на стратегию именования спящего режима.
Я использую недавно введенную аннотацию @ForignKey
для настройки имени ограничения ключа forign, и он отлично работает для @JoinColumn
, связанного с отношениями @ManyToOne
.
Проблема возникает при попытке настроить ограничения ключа forign, сгенерированные для отношений @ManyToMany
, с использованием @JoinTable
, поставщик не использует мое предоставленное имя и возвращается к произвольно сгенерированному имени.
, например:
@ManyToOne
@JoinColumn(name = "store_id", referencedColumnName = "id",
foreignKey = @ForeignKey(name = "fk_collection_store_id"))
Store store;
правильно генерировать следующий DDL
alter table collection add constraint fk_collection_store_id foreign key (store_id) references store
, но когда я пытаюсь использовать его с @ManyToMany
ассоциации, она не работает, как ожидалось:
@ManyToMany
@JoinTable(name="collection_product",
joinColumns = {@JoinColumn(name="collection_id", referencedColumnName = "id")},
foreignKey = @ForeignKey(name = "fk_collection_product__collection_id"),
inverseJoinColumns = {@JoinColumn(name="product_id", referencedColumnName = "id")},
inverseForeignKey = @ForeignKey(name = "fk_collection_product__product_id"))
List<Product> products = new ArrayList<>();
сгенерированный ddl не соблюдает мои предоставленные имена и возвращается к автоматически сгенерированным случайные имена:
alter table collection_product add constraint FK_skd8u4feadi59mpp8os1q1ar3 foreign key (product_id) references product
alter table collection_product add constraint FK_lbkv2n46sv06t6qfwabbk0wgw foreign key (collection_id) references collection
Так, что здесь не так?
, кстати, я пытался использовать ForeignKey атрибут на самом @JoinColumn
(это кажется неправильным, но я попробовал это в любом случае), и это не помогает:
@ManyToMany
@JoinTable(name="collection_product",
joinColumns={@JoinColumn(name="collection_id", referencedColumnName = "id",
foreignKey = @ForeignKey(name = "fk_collection_product__collection_id"))},
inverseJoinColumns={@JoinColumn(name="product_id", referencedColumnName = "id",
foreignKey = @ForeignKey(name = "fk_collection_product__product_id"))})
List<Product> products = new ArrayList<>();
он не работает либо:
alter table collection_product add constraint FK_skd8u4feadi59mpp8os1q1ar3 foreign key (product_id) references product
alter table collection_product add constraint FK_lbkv2n46sv06t6qfwabbk0wgw foreign key (collection_id) references collection
Каков правильный способ сделать эту работу?
Благодаря
Вы нашли решение? – mkurz
Я добавил ответ ниже. – Joseph