继承表的外键名称

Posted

技术标签:

【中文标题】继承表的外键名称【英文标题】:Foreign Key name for inherited tables 【发布时间】:2014-07-17 07:45:49 【问题描述】:

我有一个包含外键并使用 TABLE_FOR_CLASS 作为继承策略的基本实体。并且有一些从这个类扩展的子类,所以这些子类包含相同的外键引用。

由于公司的标准,我不允许共享代码。

我想为该外键命名,因为自动生成的外键名称超过 30 个字符,这会在 Oracle 12c 中导致错误并且休眠无法创建表。

当我在基类中使用@ForeignKey(name="FK_XXX") 时,子类中的外键名称变为“FK_XXX9091321asdasdasdas”等。它将生成的名称附加到基类的外键名称中。

我该如何解决这个问题?正如我所暗示的,当休眠自动生成时,我的实际问题是有超过 30 个字符的外键名称,这在 Oracle 12 中是不允许的。

【问题讨论】:

您不必共享代码,只需编写一个最小的示例... 【参考方案1】:

由于您的外键将出现在许多表中,并且它的每次出现对于数据库都是唯一的,因此您应该为所有子类覆盖它,因此下面的注释应该放在每个具有唯一外键名称的子类上方。我假设BaseClass 中指向相关实体的字段称为entityField

@AssociationOverride(name = "entityField", 
                     foreignKey = @ForeignKey(name="FK_XXX1"))
public class MySubclass extends BaseClass 
    // ...

请注意 AssociationOverride.foreignKey 是在 JPA 2.1 中添加的,不会与以前的版本一起编译。

或者,您可以实现Hibernate's Custom Naming Strategy(这可能是您的最佳选择,因为您在其他方面也会遇到类似的问题),有关更多信息,请参阅here。

【讨论】:

这对我不起作用,甚至无法编译。有没有其他方法可以做到这一点? Incompatible types: Found String required ConstraintMode 这会编译但不会覆盖名称 @AssociationOverride(name = "param", joinColumns = @JoinColumn(foreignKey = @ForeignKey(name = "FK_key_id"))) @iberbeu 我已经更新了我的答案,感谢您指出ForeignKey 注释缺少name 参数。你知道这个注解只有在创建数据库/生成 DDL 阶段才会生效吗?如果您将 hibernate.ddl-auto 设置为 createcreate-drop 它应该可以工作 这对我也不起作用。我正在使用hibernate 5hibernate-maven-plugin 来生成ddl。一切似乎都正常,但是这个插件在尝试创建 ddl 时会引发异常。如果您可以在没有此插件的情况下生成 ddl,那么这可能是hibernate-maven-plugin 中的问题

以上是关于继承表的外键名称的主要内容,如果未能解决你的问题,请参考以下文章

Oracle一个字段的的外键可以当另一个字段的主键吗

mysql表创建好后添加外键

数据库中外键名可以随便起吗

mysql数据库怎么删除一个表的外键

PostgreSQL 行级安全性涉及与其他表的外键

mysql对表的操作和数据库级别的外键