11

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

aboger
  • 2,214
  • 6
  • 33
  • 47
grep
  • 5,465
  • 12
  • 60
  • 112

3 Answers3

0

I guess that you have some jar conflicts there. I suggest to do this:

  1. remove the following jars: hibernate-commons-annotations and hibernate-entitymanager
  2. then look here how you can change the name of the foreign key
Community
  • 1
  • 1
alexandrum
  • 429
  • 9
  • 17
0

Keep it simple, if you can modify the DB structure is will be easier to generate just one foreign key

@OneToOne()
@JoinColumn(name="vehicle_id", referencedColumnName="vehicleId")
@ForeignKey(name="Fk_userdetails_vehicle")
public Vehicle getVehicle() {
   return vehicle;
}
Rafael
  • 104
  • 8
0

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

grep
  • 5,465
  • 12
  • 60
  • 112