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

HDa*_*ave 24 database orm hibernate jpa constraints

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

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

如果是这样,它将使得更容易跟踪日志文件中的问题以及违规不会告诉您除约束名称之外的任何其他地方的问题.

Pio*_*hen 20

从JPA 2.1开始,可以为外键命名.例如

@ManyToOne
@JoinColumn(foreignKey=@ForeignKey(name="MY_FANCY_FK_NAME"))
Account account;
Run Code Online (Sandbox Code Playgroud)

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

  • 有没有办法用 PK 索引做到这一点? (2认同)

Pas*_*ent 15

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

2.4.6.集合相关的注释

(......)

由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
Run Code Online (Sandbox Code Playgroud)

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

  • @arjantop:不,这不允许指定外键约束的名称。你没有抓住重点。 (2认同)
  • 不推荐使用Hibernate @ForeignKey,而是使用JPA注释. (2认同)