继承表的外键名称

时间:2014-07-17 07:45:49

标签: java sql oracle hibernate jpa

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

由于我公司的标准,我不能分享代码。

我想给该外键命名,因为自动生成的外键名称超过30个字符,导致Oracle 12c出错,而hibernate无法创建表。

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

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

1 个答案:

答案 0 :(得分:3)

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

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

请注意,JPA 2.1中添加了AssociationOverride.foreignKey,并且不会使用以前的版本进行编译。

或者您可以实施Hibernate's Custom Naming Strategy(这可能是您的最佳选择,因为您会遇到与其他事情类似的问题),有关详细信息,请参阅here