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:
{code:java} @ManyToOne @JoinColumn(name = "store_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "fk_collection_store_id")) Store store; {code}
correctly generate the following ddl
{code:java} alter table collection add constraint fk_collection_store_id foreign key (store_id) references store {code}
but when i try to use it with @ManyToMany association, it does not work as expected:
{code:java} @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<>(); {code}
the generated ddl doesnot honor my provided names, and revert to the auto generated random names:
{code:java} 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 {code}
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:
{code:java} @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<>(); {code}
it does not work either:
{code:java} 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 {code}
what is the correct way to make this work?
Thanks |
|