我有@ManyToMany时如何设置外键名称

时间:2014-10-10 13:46:38

标签: hibernate jpa foreign-keys naming

我正在使用JPA类创建数据库。

如果我们有 ManyToOne 关系,我们可以像这样覆盖ForeignKey名称:

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

在DB中,我们会得到这样的结果:

enter image description here

好的,那太好了。好结果!

但是当我有@ManyToMany时,我将无法设置自己的FK名称。

我该如何创建?我尝试这样的东西,但它不起作用:

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

或类似的东西:

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

或者这个:

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

它们不起作用。

我使用这个版本的罐子:

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

我的java版本是1.8

3 个答案:

答案 0 :(得分:0)

我猜你那里有一些jar冲突。 我建议这样做:

  1. 删除以下jar:hibernate-commons-annotations和hibernate-entitymanager
  2. 然后看here如何改变 外键的名称

答案 1 :(得分:0)

保持简单,如果可以修改数据库结构将更容易生成一个外键

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

答案 2 :(得分:0)

问题是由hibernate错误引起的。我正在测试hibernate 4.3.X.解决方案:更新hibernate版本。此问题已在较新版本中修复