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

Posted

技术标签:

【中文标题】我可以用 JPA 命名我的约束吗?【英文标题】:Can I name my constraints with JPA? 【发布时间】:2011-03-11 07:04:38 【问题描述】:

当我使用 maven-hibernate3-plugin(又名 hbm2ddl)生成我的数据库架构时,它会创建许多数据库约束,这些约束名称非常难以记住,例如 FK7770538AEE7BC70

有什么方法可以提供更有用的名称,例如FOO_FK_BAR_ID

如果是这样,那么在日志文件和其他除了约束名称之外没有告诉您任何违规信息的地方会更容易追踪问题。

【问题讨论】:

没有。 JDO 是唯一支持约束命名(索引、唯一性、FK、PK)的标准。 你不能命名 PK:***.com/q/3289126/1389219 【参考方案1】:

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 等效项。

【讨论】:

在 JPA 中:@JoinTable(joinColumns=@JoinColumn(name="TO_WOMAN_FK"), inverseJoinColumns=@JoinColumn(name="TO_MAN_FK")) @arjantop:不,这不允许指定外键约束的名称。你没抓住重点。 Hibernate @ForeignKey 已弃用,请改用 JPA 注释。【参考方案2】:

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

@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

【讨论】:

有没有办法用 PK 索引来做到这一点? 您是否需要更改自动创建的 PK 索引的名称 (AFAICT)? 是的,就像用户询问想为 FK 定义一个名称,以避免“难以处理”的名称 我想这在某些情况下可能需要,但老实说,我从未见过任何(业务)需要重命名默认 PK 的“唯一索引”。我可以想象这个名字可能是“难以处理”,但如果真的需要和/或合理的“处理”,我会关注。无论如何,我不知道这样的方式,我从来没有必要。 你是对的,在大多数情况下没有人需要它,但在这种情况下,我们希望制作一个社区数据库框架,用于许多项目和许多初创公司,这样用户会更容易如果所有对象都正确命名,则了解模型。【参考方案3】:

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

如果你是一个全栈角色,你决定一切,你只能使用 @ForeignKey 注释更改当前版本的外键名称。

但我仍然建议将 DDL 语句手动插入到您的数据库中,而不是让系统进程来控制,因为如果采用手动 DBA 架构,维护数据库和对结构进行碎片整理会变得更容易。

希望这能回答你的问题。

【讨论】:

以上是关于我可以用 JPA 命名我的约束吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 SQL Server 的添加列语句中创建命名默认约束吗?

我的约束破坏日志没有任何意义,有人可以帮助我理解吗?

JPA + Hibernate:如何定义具有 ON DELETE CASCADE 的约束

JPA 验证唯一约束的最佳方法

如何使用jpa项目eclipse在实体类中生成唯一约束

Fluent NHibernate 主键约束命名约定