Hibernate:自定义实体名称

Posted

技术标签:

【中文标题】Hibernate:自定义实体名称【英文标题】:Hibernate: custom entity name 【发布时间】: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

    ...

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

好的,谢谢 - 我想我得养成手动命名所有内容的习惯了 :)

以上是关于Hibernate:自定义实体名称的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 实体之间的自定义关联

Hibernate - 自定义查询未通过 ManyToOne 单向关系的 child 参数找到实体

如何使用 JPA 和 Hibernate 通过自定义对象实体属性进行查询

将自定义字段添加到 Hibernate Envers 修订表 (revinfo),如 operation_id。哪个是操作实体的PK

10-hibernate单表操作-组件属性

hibernate注解