继承表的外键名称
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
设置为 create
或 create-drop
它应该可以工作
这对我也不起作用。我正在使用hibernate 5
和hibernate-maven-plugin
来生成ddl。一切似乎都正常,但是这个插件在尝试创建 ddl 时会引发异常。如果您可以在没有此插件的情况下生成 ddl,那么这可能是hibernate-maven-plugin
中的问题以上是关于继承表的外键名称的主要内容,如果未能解决你的问题,请参考以下文章