【发布时间】:2016-10-13 18:29:18
【问题描述】:
假设我有一个名字很长的实体:
@Entity
public class SupercalifragilisticexpialidociousPanda
{
...
}
使用 Hibernate 将其持久化到 Postgres 数据库可以完美地工作。然而,Oracle 不允许表/列/索引名称超过 30 个字符。 这应该很容易解决,因为我可以手动指定表名,如下所示:
@Entity
@Table(name="SuperPanda")
public class SupercalifragilisticexpialidociousPanda
{
...
}
现在一切都恢复正常...除了我对其他表中实体的任何引用仍然使用长类名(“SupercalifragilisticexpialidociousPanda”)而不是短表名(“SuperPanda”)。
例如,如果实体有一个嵌入的 ElementCollection,像这样:
@ElementCollection
private Set<String> nicknames;
Hibernate 会尝试像这样创建一个 DB: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
{
...
}
...但这并不能解决问题。
在这种情况下,人们通常会怎么做?
【问题讨论】: