2015-12-21 3 views
1

Я разрабатываю приложение, использующее 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 

Каков правильный способ сделать эту работу?

Благодаря

+0

Вы нашли решение? – mkurz

+0

Я добавил ответ ниже. – Joseph

ответ

1

Поиск отслеживания проблем Hibernate, я нашел несколько сообщений об ошибках, связанных с этим вопросом.

Он частично исправлен в выпусках 5.x. в некоторых случаях все еще не выбраны новыми системами, такими как отношения во встроенных постоянных классах. Я намерен в ближайшее время зарегистрировать ошибку

пока что вы можете обновить версию до 5.x, я использую 5.1 и отлично работаю, и проблем с переносом немного.

+0

Похоже, что атрибут 'foreignKeyDefinition' аннотации @ javax.persistence.ForeignKey еще не реализован в Hibernate - см. Https://hibernate.atlassian.net/browse/HHH-10643 – mkurz

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