Java 继承表的外键名称
我有一个基本实体,它包含一个外键,并使用表\u作为继承策略。还有一些子类从这个类扩展而来,所以这些子类包含相同的外键引用 由于我公司的标准,我不允许共享代码 我想为该外键命名,因为自动生成的外键名称超过30个字符,这会导致Oracle 12c中出现错误,hibernate无法创建表 当我在基类中使用@ForeignKey(name=“FK_XXX”)时,子类中的外键名变为“FK_xxx9091321asdasdas”等。它将生成的名称附加到基类的外键名Java 继承表的外键名称,java,sql,oracle,hibernate,jpa,Java,Sql,Oracle,Hibernate,Jpa,我有一个基本实体,它包含一个外键,并使用表\u作为继承策略。还有一些子类从这个类扩展而来,所以这些子类包含相同的外键引用 由于我公司的标准,我不允许共享代码 我想为该外键命名,因为自动生成的外键名称超过30个字符,这会导致Oracle 12c中出现错误,hibernate无法创建表 当我在基类中使用@ForeignKey(name=“FK_XXX”)时,子类中的外键名变为“FK_xxx9091321asdasdas”等。它将生成的名称附加到基类的外键名 我怎样才能解决这个问题?正如我所暗示的,我
我怎样才能解决这个问题?正如我所暗示的,我的实际问题是,当hibernates自动生成时,外键名超过30个字符,这在Oracle 12中是不允许的。由于您的外键将出现在许多表中,并且它的每一次出现对于数据库都是唯一的,所以您应该为所有子类重写它,所以下面的注释应该放在每个具有唯一外键名的子类之上。我假设
BaseClass
中指向相关实体的字段称为entityField
@AssociationOverride(name = "entityField",
foreignKey = @ForeignKey(name="FK_XXX1"))
public class MySubclass extends BaseClass {
// ...
}
请注意,AssociationOverride.foreignKey
是在JPA2.1中添加的,不会使用以前的版本编译
或者,您可以实施Hibernate的自定义命名策略(这可能是您的最佳选择,因为您在其他方面也会遇到类似的问题),有关详细信息,请参阅。由于您的外键将出现在许多表中,并且它的每一次出现对于数据库都是唯一的,因此您应该为所有子类重写它,所以下面的注释应该放在每个具有唯一外键名的子类之上。我假设
BaseClass
中指向相关实体的字段称为entityField
@AssociationOverride(name = "entityField",
foreignKey = @ForeignKey(name="FK_XXX1"))
public class MySubclass extends BaseClass {
// ...
}
请注意,AssociationOverride.foreignKey
是在JPA2.1中添加的,不会使用以前的版本编译
或者,您可以实施Hibernate的自定义命名策略(这可能是您的最佳选择,因为您在其他方面也会遇到类似的问题),有关详细信息,请参阅。由于您的外键将出现在许多表中,并且它的每一次出现对于数据库都是唯一的,因此您应该为所有子类重写它,所以下面的注释应该放在每个具有唯一外键名的子类之上。我假设
BaseClass
中指向相关实体的字段称为entityField
@AssociationOverride(name = "entityField",
foreignKey = @ForeignKey(name="FK_XXX1"))
public class MySubclass extends BaseClass {
// ...
}
请注意,AssociationOverride.foreignKey
是在JPA2.1中添加的,不会使用以前的版本编译
或者,您可以实施Hibernate的自定义命名策略(这可能是您的最佳选择,因为您在其他方面也会遇到类似的问题),有关详细信息,请参阅。由于您的外键将出现在许多表中,并且它的每一次出现对于数据库都是唯一的,因此您应该为所有子类重写它,所以下面的注释应该放在每个具有唯一外键名的子类之上。我假设
BaseClass
中指向相关实体的字段称为entityField
@AssociationOverride(name = "entityField",
foreignKey = @ForeignKey(name="FK_XXX1"))
public class MySubclass extends BaseClass {
// ...
}
请注意,AssociationOverride.foreignKey
是在JPA2.1中添加的,不会使用以前的版本编译
或者,您可以实施
Hibernate的自定义命名策略
(这可能是您的最佳选择,因为您在其他方面也会遇到类似的问题),有关更多信息,请参阅。您不必共享代码,只需编写一个最小的示例……您不必共享代码,只需编写一个最小的示例…您不必共享代码,只需编写一个最小的示例…您不必共享代码,只需编写一个最小的示例…这对我不起作用,它甚至无法编译。有没有其他方法可以做到这一点?不兼容的类型:找到字符串所需的约束模式
这会编译但不会覆盖名称@AssociationOverride(name=“param”,joinColumns=@JoinColumn(foreignKey=@foreignKey(name=“FK_key_id”))
@iberbeu我已经更新了答案,感谢您指出name
参数在ForeignKey
注释中的不足。您是否知道此注释仅在创建数据库/生成DDL阶段时生效?如果将hibernate.ddl auto
设置为create
或create drop
它应该可以工作,但对我来说也不起作用。我正在使用hibernate5
和hibernatemaven插件
生成ddl。一切似乎都正常,但是这个插件在尝试创建ddl时抛出了一个异常。如果您可以在没有此插件的情况下生成ddl,那么在hibernate maven plugin
中可能会出现问题。这对我不起作用,它甚至无法编译。有没有其他方法可以做到这一点?不兼容的类型:找到字符串所需的约束模式
这会编译但不会覆盖名称@AssociationOverride(name=“param”,joinColumns=@JoinColumn(foreignKey=@foreignKey(name=“FK_key_id”))
@iberbeu我已经更新了答案,感谢您指出name
参数在ForeignKey
注释中的不足。您是否知道此注释仅在创建数据库/生成DDL阶段时生效?如果将hibernate.ddl auto
设置为create
或create drop
它应该可以工作,但对我来说也不起作用。我正在使用hibernate5
和hibernatemaven插件
生成ddl。一切似乎都正常,但是这个插件在尝试创建ddl时抛出了一个异常。如果您可以在没有此插件的情况下生成ddl,那么在hibernate maven plugin
中可能会出现问题。这对我不起作用,它甚至无法编译。还有别的办法吗