Search code examples
hibernatejpaforeign-keysnaming

how to set ForeignKey name when I have @ManyToMany


I'm creating databases using JPA classes.

If we have ManyToOne relation, we can override ForeignKey name name like this:

@ManyToOne
@JoinColumn(foreignKey = @ForeignKey(name = "FK_COUNTRY"))
private Country country;

In DB, we will have such a result:

enter image description here

Ok, that's nice. good result!

BUT I will not manage to set my own FK names when I have @ManyToMany.

How can I create this? I try something like this, but it does not works:

@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = "NEW_TABLE",  foreignKey = @ForeignKey(name = "FK_TEST"))

Or something like this:

@JoinTable(
        name="NEW_TABLE",
        joinColumns=
            @JoinColumn(name="ID1", referencedColumnName="ID",  foreignKey = @ForeignKey(name = "FK_DEV_ID")),
        inverseJoinColumns=
            @JoinColumn(name="ID2", referencedColumnName="ID", foreignKey = @ForeignKey(name = "FK_DEV_ZONE"))
    )  

Or this:

@ManyToMany(cascade = CascadeType.PERSIST)
@JoinTable(name="NEW_TABLE_2",
            joinColumns=
                @JoinColumn(name="ID1", referencedColumnName="ID", 
                            foreignKey = @ForeignKey(name = "FK_1")
                ),
            inverseJoinColumns=
                @JoinColumn(name="ID2", referencedColumnName="ID", 
                            foreignKey = @ForeignKey(name = "FK_2")
                ),
            
            foreignKey = @ForeignKey(name = "FK_1"),
            inverseForeignKey = @ForeignKey(name = "FK_2")
    )  

private List<MyObject> deviceZones;

They does not work.

I use this version of jars:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.3.6.Final</version>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.3.6.Final</version>
</dependency>

<dependency>
    <groupId>org.hibernate.common</groupId>
    <artifactId>hibernate-commons-annotations</artifactId>
    <version>4.0.5.Final</version>
</dependency>


<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.1.2.Final</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.0.6.RELEASE</version>
</dependency>

And my java version is 1.8


Solution

  • The problem was caused by hibernate bug. I was testing on hibernate 4.3.X. Solution: Update hibernate version. The problem is fixed in newer versions