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

我的 UserDetails 类与实体类 Vehicle 具有一对一的映射关系。Hibernate创建 2 个表并分配一个通用外键,它将 vehicle_id 列(UserDetails 表。)映射到主键 vehicleId(Vehicle 表)。

KEY FKB7C889CEAF42C7A1 (vehicle_id),
CONSTRAINT FKB7C889CEAF42C7A1 FOREIGN KEY (vehicle_id) REFERENCES vehicle (vehicleId)

我的问题是:我们如何将生成的外键更改为有意义的东西,例如 Fk_userdetails_vehicle。

4

4 回答 4

33

从 JPA 2.1 开始,您可以使用@javax.persistence.ForeignKey注释:

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

在 JPA 2.1 之前,您可以使用 Hibernate 的@org.hibernate.annotations.ForeignKey注释,但现在已弃用:

@OneToOne()
@JoinColumn(name="vehicle_id", referencedColumnName="vehicleId")
@ForeignKey(name="Fk_userdetails_vehicle")
public Vehicle getVehicle() {
   return vehicle;
}
于 2013-05-15T12:23:37.850 回答
28

您也可以像这样使用@ForeignKey嵌入 @JoinColumn

@JoinColumn(name = "BAR_ID", foreignKey = @ForeignKey(name = FK_BAR_OF_FOO))

对于@ManyToMany您可以像这样使用foreignKeyinverseForeignKey嵌入的关系@JoinTable

@JoinTable(name = "ARC_EMPLOYEE_OF_BAR"
        , joinColumns = {@JoinColumn(name = "BAR_ID")}
        , inverseJoinColumns = {@JoinColumn(name = "EMPLOYEE_ID")}
        , uniqueConstraints = {@UniqueConstraint(name = "ARC_UK_EMPLOYEE_OF_BAR", columnNames = {"EMPLOYEE_ID", "BAR_ID"})}
        , foreignKey = @ForeignKey(name = "ARC_FK_BAR_OF_EMPLOYEE")
        , inverseForeignKey = @ForeignKey(name = "ARC_FK_EMPLOYEE_OF_BAR"))
于 2015-05-15T10:18:11.080 回答
1

您也可以通过实施ImplicitNamingStrategy.determineForeignKeyName和使用来做到这一点

configuration.setImplicitNamingStrategy(
    new MyImplicitNamingStrategy())

这很好,因为您不必一次又一次地手动操作。但是,可能很难将相关信息放在那里。我试图连接我得到的所有东西(使用三个下划线分隔部分)并最终得到

FK_ACCESS_TEMPLATE____TEMPLATE____TEMPLATE_ID____TEMPLATE_ID__INDEX_B

这并不比

FKG2JM5OO91HT64EWUACF7TJCFN_INDEX_B

我想,仅使用引用的表和列名以及唯一性数字就可以了。


另请注意,这似乎是遗留的 Hibernate 东西,不受 JPA 支持。

OTOH 它适用于 Hibernate 5.0.1(仅一周大)。

于 2015-09-10T02:23:17.850 回答
-3

也许你应该试试这个,添加@ForeignKey注释:

@ManyToOne
@ForeignKey(name="FK_some_model")
@JoinColumn(name="some_model_id")
private SomeModel someModel
于 2013-05-15T12:23:59.463 回答