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 - 自定义查询未通过 ManyToOne 单向关系的 child 参数找到实体
如何使用 JPA 和 Hibernate 通过自定义对象实体属性进行查询
将自定义字段添加到 Hibernate Envers 修订表 (revinfo),如 operation_id。哪个是操作实体的PK