【问题标题】:Hibernate: custom entity nameHibernate:自定义实体名称
【发布时间】: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
{
    ...
}

...但这并不能解决问题。

在这种情况下,人们通常会怎么做?

【问题讨论】:

    标签: java oracle hibernate jpa


    【解决方案1】:

    通常人们自己为每个数据库事物(表、列、索引)命名。当您决定重构某些东西时,让 Hibernate 为您决定可能会导致问题。

    所有引用都可以以一种或另一种方式配置为使用您决定使用的名称。

    问具体问题,以防你自己想出办法。

    【讨论】:

    • 好的,谢谢 - 我想我得养成手动命名所有内容的习惯了 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多