2014-10-10 96 views
11

我正在使用JPA类创建数据库。如何在@ManyToMany中设置ForeignKey名称

如果我们有多对一关系,我们可以覆盖ForeignKey的名字名字是这样的:

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

在数据库中,我们都会有这样的结果:

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; 

他们不起作用。

我使用这个版本的jar文件:

<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

+0

您是否尝试过添加inverseForeignKey属性? – Giovanni 2014-10-10 14:24:30

+0

@Giovanni是的,我已经更新了我的问题。我在我的问题中写了这个(如果它是真的)。 – grep 2014-10-10 14:44:51

+1

你使用的是什么版本的Hibernate?我记得在这方面看到一些错误:例如https://hibernate.atlassian.net/browse/HHH-8783。 – 2014-10-10 15:27:06

回答

0

这个问题是由于hibernate bug造成的。我正在测试休眠4.3.X.解决方案:更新休眠版本。该问题已在更新版本中修复

0

我猜你有一些罐子冲突存在。 我建议这样做:

  1. 删除以下罐:冬眠 - 公地Annotations和Hibernate-EntityManager的
  2. 再看看here如何更改 外键
0

的名字保持简单,如果你可以修改DB结构,将会更容易生成一个外键

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