Joseph
Joseph

Reputation: 3155

Why does JPA (Hibernate) foreign key definition on @JoinTable not work?

I am developing an application using JPA 2.1 with Hibernate 4.3 as the persistence 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:

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

correctly generate the following ddl

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:

@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 does not honor my provided names, and revert to the auto generated random names:

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 foreignKey attribute on the @JoinColumn itself (it seems wrong, but i tried it anyway) and it does not help either:

@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:

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

Upvotes: 1

Views: 2610

Answers (1)

Joseph
Joseph

Reputation: 3155

Searching the Hibernate issue tracker, I found several bug reports related to this issue.

It is partially fixed in the 5.x releases. some cases still not picked by the new systems, such as relationships in embedded persistent classes. I intend to file a bug for this shortly

meanwhile you can upgrade to 5.x version, I use 5.1 and is working fine, and there is little porting issues.

Upvotes: 1

Related Questions