假设我有一个名称很长的实体:
@Entity
public class SupercalifragilisticexpialidociousPanda
{
...
}
使用 Hibernate 将其持久保存到 Postgres DB 可以完美地工作。然而,Oracle 不允许表/列/索引名称超过 30 个字符。 这应该很容易修复,因为我可以手动指定表名称,如下所示:
@Entity
@Table(name="SuperPanda")
public class SupercalifragilisticexpialidociousPanda
{
...
}
现在一切都恢复正常工作......除了我对其他表中的实体的任何引用仍然使用长类名称(“SupercalifragilisticexpialidociousPanda”)而不是短表名称(“SuperPanda”)。
例如,如果实体有一个嵌入的 ElementCollection,如下所示:
@ElementCollection
private Set<String> nicknames;
Hibernate 会尝试创建这样的数据库:create table SupercalifragilisticexpialidociousPanda_nicknames
,这自然会导致 ORA-00972:identifier is too long
错误。
对于 @OneToOne
关联也会发生同样的情况,其中查找列将被称为 supercalifragilisticexpialidociousPanda_uuid
之类的名称,这在 Oracle 中也会失败。
现在,一种选择是手动添加 @CollectionTable(name="SuperPanda_nicknames")
和 @Column(name="...")
注释引用该实体的每个字段,但这需要大量工作,而且很容易出错。
有没有办法告诉 Hibernate 一次在需要引用实体的地方使用短名称?
我还尝试设置实体名称,如下所示:
@Entity(name="SuperPanda")
@Table(name="SuperPanda")
public class SupercalifragilisticexpialidociousPanda
{
...
}
...但这并不能解决问题。
遇到这种情况通常会做什么?
最佳答案
通常人们自己为每个数据库事物(表、列、索引)命名。当您决定重构某些内容时,让 Hibernate 为您做决定可能会导致将来出现问题。
所有引用都可以以一种或另一种方式配置,以使用您决定使用的名称。
提出具体问题,以防您自己找出解决方法。
关于java - Hibernate:自定义实体名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40028390/