@OneToOne()
@JoinColumn(name="vehicle_id", referencedColumnName="vehicleId")
public Vehicle getVehicle() {
return vehicle;
}
我的UserDetails类与Entitity类Vehicle具有一对一的映射。 Hibernate
创建2个表并分配一个通用的外键,它将vehicle_id列(UserDetails表。)映射到主键vehicleId(Vehicle table)。
KEY FKB7C889CEAF42C7A1 (vehicle_id),
CONSTRAINT FKB7C889CEAF42C7A1 FOREIGN KEY (vehicle_id) REFERENCES vehicle (vehicleId)
我的问题是:我们如何将生成的外键更改为有意义的内容,例如Fk_userdetails_vehicle。
答案 0 :(得分:23)
此外,您可以使用@ForeignKey
中嵌入的@JoinColumn
,如下所示:
@JoinColumn(name = "BAR_ID", foreignKey = @ForeignKey(name = FK_BAR_OF_FOO))
对于@ManyToMany
关系,您可以foreignKey
嵌入inverseForeignKey
和@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"))
答案 1 :(得分:20)
自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;
}
答案 2 :(得分: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(仅一周)。
答案 3 :(得分:-3)
您可以尝试这样做,添加@ForeignKey
注释:
@ManyToOne
@ForeignKey(name="FK_some_model")
@JoinColumn(name="some_model_id")
private SomeModel someModel