我有一个包含外键的基本实体,并使用TABLE_FOR_CLASS作为继承策略。并且有一些子类从这个类扩展,因此这些子类包含相同的外键引用。
由于我公司的标准,我不能分享代码。
我想给该外键命名,因为自动生成的外键名称超过30个字符,导致Oracle 12c出错,而hibernate无法创建表。
当我在基类中使用@ForeignKey(name =" FK_XXX")时,子类中的外键名称变为" FK_XXX9091321asdasdasdas"它将生成的名称附加到基类'外键名称。
我该如何解决这个问题?正如我暗示的那样,我的实际问题是在自动生成休眠时有超过30个字符的外键名称,这在Oracle 12中是不允许的。
答案 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。