JPA (Hibernate) forign key definition on @JoinTable does not work

Description

I am developing an application using JPA 2.1 with Hibernate 4.3 as the persistance provider.

For the sacke of readability and better maintainance, I want to explicitly name every possible think and not to rely on the hibernate naming strategy.

I am using the newly introduced @ForignKey annotation to customize the forign key constraint name, and it works fine for @JoinColumn associated with @ManyToOne relationships.

The problem comes when trying to customise the forign key constraints generated for @ManyToMany relationship using a @JoinTable, the provider do not use my provided name, and revert back to its randomly generated name.

for example:
Assuming we have an entity called collection:

1 2 3 4 @ManyToOne @JoinColumn(name = "store_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "fk_collection_store_id")) Store store;

correctly generate the following ddl

1 alter table collection add constraint fk_collection_store_id foreign key (store_id) references store

but when i try to use it with @ManyToMany association, it does not work as expected:

1 2 3 4 5 6 7 @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<>();

the generated ddl doesnot honor my provided names, and revert to the auto generated random names:

1 2 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

So, what is wrong here?

by the way, I tried to use foregnKey attribute on the @JoinColumn itself (it seems wrong, but i tried it anyway) and it does not help either:

1 2 3 4 5 6 7 @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<>();

it does not work either:

1 2 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

what is the correct way to make this work?

Thanks

Environment

None

Status

Assignee

Gail Badner

Reporter

joef

Fix versions

None

Labels

None

backPortable

None

Suitable for new contributors

None

Requires Release Note

None

Pull Request

None

backportDecision

None

Components

Affects versions

4.3.11

Priority

Major
Configure