2013-05-15 70 views
14
@OneToOne() 
@JoinColumn(name="vehicle_id", referencedColumnName="vehicleId") 
public Vehicle getVehicle() { 
    return vehicle; 
} 

我的UserDetails类与Entitity类Vehicle有一对一的映射关系。 Hibernate创建2个表并分配通用外键,该通用外键将vehicle_id列(UserDetails表)映射到主键vehicleId(车辆表)。在休眠状态下更改生成的外键名称

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

我的问题是:我们如何改变这种生成的外键,进入例如有意义的事情,比如Fk_userdetails_vehicle。

+0

1.为什么要更改生成的外键约束? 2.如果您通过手动更改它,可能会出现关于其唯一性的问题(您必须检查每个表约束键并检查重复)? –

+2

@Ashok_udhay由于有关外键的错误通常只会导致数据库吐出外键的名称,因此命名键可为您提供一些关键内容的上下文,而不必先在数据库中追踪它创建脚本。 – Patrick

回答

12

由于JPA 2.1,你可以使用@javax.persistence.ForeignKey注释:

@OneToOne() 
@JoinColumn(name="vehicle_id", referencedColumnName="vehicleId", [email protected](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

'注释@ForeignKey不允许用于此位置。 – membersound

+1

使用hibernate的外键注释,不要使用javax.persistence。ForeignKey,那么它的工作原理 –

+4

已弃用...... – Shine

-1

可能是你应该试试这个,加个@ForeignKey注释:

@ManyToOne 
@ForeignKey(name="FK_some_model") 
@JoinColumn(name="some_model_id") 
private SomeModel someModel 
18

您也可以使用@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")) 
+0

Thx。使用javax.persistence。* – Alexander

+0

不适用于我(ManyToMany)。 Hibernate仍尝试用自己的名字创建FK约束。 – velis

+0

回答修改和编辑 –

0

你可以做到这一点还通过实施ImplicitNamingStrategy.determineForeignKeyName和使用

configuration.setImplicitNamingStrategy(
    new MyImplicitNamingStrategy()) 

这是很好,因为您不必一次又一次手动进行操作。但是,可能很难在那里提供相关信息。我试图Concat的一切,我得到了(用三个下划线的部分分开),并结束了与

FK_ACCESS_TEMPLATE____TEMPLATE____TEMPLATE_ID____TEMPLATE_ID__INDEX_B 

这是不是真的比

FKG2JM5OO91HT64EWUACF7TJCFN_INDEX_B 

我想,只使用引用的表和列名和一个唯一性的数字将会很好。


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

OTOH它与Hibernate 5.0.1(只有一个星期大)工作。