如何在@ManyToMany中设置ForeignKey名称
问题描述:
我正在使用JPA类创建数据库。如何在@ManyToMany中设置ForeignKey名称
如果我们有多对一关系,我们可以覆盖ForeignKey的名字名字是这样的:
@ManyToOne
@JoinColumn(foreignKey = @ForeignKey(name = "FK_COUNTRY"))
private Country country;
在数据库中,我们都会有这样的结果:
好吧,这是不错。好结果!
但是当我拥有@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
答
这个问题是由于hibernate bug造成的。我正在测试休眠4.3.X.解决方案:更新休眠版本。该问题已在更新版本中修复
答
的名字保持简单,如果你可以修改DB结构,将会更容易生成一个外键
@OneToOne()
@JoinColumn(name="vehicle_id", referencedColumnName="vehicleId")
@ForeignKey(name="Fk_userdetails_vehicle")
public Vehicle getVehicle() {
return vehicle;
}
您是否尝试过添加inverseForeignKey属性? – Giovanni 2014-10-10 14:24:30
@Giovanni是的,我已经更新了我的问题。我在我的问题中写了这个(如果它是真的)。 – grep 2014-10-10 14:44:51
你使用的是什么版本的Hibernate?我记得在这方面看到一些错误:例如https://hibernate.atlassian.net/browse/HHH-8783。 – 2014-10-10 15:27:06