【问题标题】:Hibernate ignores @Table(name = "...") for extended classes - created tablenames are all lower caseHibernate 忽略扩展类的 @Table(name = "...") - 创建的表名都是小写的
【发布时间】:2012-01-26 04:39:54
【问题描述】:

我们通过 Hibernate 自动创建表,方法是:

@Table(name = "some_table") 

这曾经适用于“正常”实体。但是当我们有一个抽象基类时:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class PersonBankAccount extends AbstractPersistable<Long> {

扩展
@Entity
@Table(name = "person_bank_account")
public class PersonBankAccountSimple extends PersonBankAccount {

数据库中的结果表被命名

personbankaccount

这是怎么回事?

自动生成器说:

table not found: PersonBankAccount 

当第一次创建它并重新运行时,他说:

table found: personbankaccount

就像我说的,对于普通的桌子,一切正常。

【问题讨论】:

  • 不确定是否相关,但是在使用单表继承策略时需要指定鉴别器列和值。
  • @Perception 我认为您必须提供鉴别器列。 JPA 2.0 FR 规范说(11.1.10“DiscriminatorColumn Annotation”):“如果缺少 DiscriminatorColumn 注释,并且需要一个鉴别器列,则鉴别器列的名称默认为“DTYPE”,鉴别器类型为 STRING 。”
  • 是的,他会自动执行此操作。想知道那些 DTYPE 列是从哪里来的……;)如果我在每个目标应用程序中总是只有一个扩展类,我真的可以禁用这些列吗?

标签: java hibernate jpa entity


【解决方案1】:

不应该是基类中的表名。

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "person_bank_account")
public class PersonBankAccount extends AbstractPersistable<Long> {

【讨论】:

  • 我想我试过了,它没有用,可能只是为了连接表继承。但我会再试一次,看看会发生什么。也许也可以在两个类中都有一个表名。问题是,一切都与该设置、应用程序逻辑和所有内容一起运行良好,只是名称很奇怪..
  • 看起来成功了,但我想知道为什么我决定将表名放在扩展类中。一定有一个原因让我现在逃避,因为将名称放在基类中似乎很自然和合乎逻辑。哦,好吧,无论如何,谢谢;)
猜你喜欢
  • 2016-07-19
  • 2012-11-09
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多