我可以用JPA命名我的约束吗?

时间:2010-07-02 21:17:03

标签: database hibernate orm jpa constraints

当我使用maven-hibernate3-plugin(又名hbm2ddl)来生成我的数据库模式时,它会创建许多数据库约束,其中包含非常难以记住的约束名称,如FK7770538AEE7BC70

有没有办法提供更有用的名称,例如FOO_FK_BAR_ID

如果是这样,它会更容易追踪日志文件和其他违规行为不会告诉您除约束名称之外的其他地方的问题。

3 个答案:

答案 0 :(得分:20)

从JPA 2.1开始,可以为外键命名。 E.g。

@ManyToOne
@JoinColumn(foreignKey=@ForeignKey(name="MY_FANCY_FK_NAME"))
Account account;

确保在@JoinColumn中使用它。 JavaDoc:https://docs.oracle.com/javaee/7/api/javax/persistence/ForeignKey.html#name%28%29

答案 1 :(得分:15)

Hibernate有一个@ForeignKey注释,允许覆盖约束名称。从参考文档:

  

2.4.6. Collection related annotations

     

(...)

     

外键约束,而   由Hibernate生成,有一个公平的   不可读的名字。你可以覆盖   约束名称使用@ForeignKey。   请注意,此注释必须是   放在拥有的一面   关系,inverseName   参考另一方   约束

@Entity
public class Woman {
    ...
    @ManyToMany(cascade = {CascadeType.ALL})
    @ForeignKey(name = "TO_WOMAN_FK", inverseName = "TO_MAN_FK")
    public Set<Man> getMens() {
        return mens;
    }
}

alter table Man_Woman add constraint TO_WOMAN_FK foreign key (woman_id) references Woman
alter table Man_Woman add constraint TO_MAN_FK foreign key (man_id) references Man

但我不知道标准的JPA等价物。

答案 2 :(得分:-1)

通常在企业堆栈中,DBA不会也不应该允许在其数据库中创建系统实体。他们通常会要求手动插入DDL,并且您将Hibernate应用程序ddl-auto设置为更新模式,而不是创建或创建 - 删除模式。这是我工作过的大多数品牌的理想情景。话虽如此,您可以让DBA决定通过Hibernate为您生成的alter-table语句重命名Constraints。此外,一旦将Create table DDL移交给它们,主键约束名称也将由DBA管理。

如果您处于完整堆栈角色,您决定所有内容,则只能使用@ForeignKey批注更改当前版本的外键名称。

但我仍然建议,手动将DDL语句插入数据库而不是允许系统进程控制,因为如果采用手动DBA架构,维护数据库和解析结构会变得更容易。

希望这能回答你的问题。