【问题标题】:Mapping Multiple Classes to a Table in Hibernate, Without a DTYPE Column将多个类映射到 Hibernate 中的表,没有 DTYPE 列
【发布时间】:2011-06-19 13:57:20
【问题描述】:

我有两个休眠类:一个基类和一个具有附加字段的扩展类。 (这些字段由其他表映射。)

例如,我有:

@Entity
@Table(name="Book")
public class A {
    private String ID;
    private String Name;
    // ...
}

@Entity
@Table(name="Book")
public class B extends A {
    public String node_ID;
    // ...
}

public class Node {
    public String ID; // maps to B.node_ID
    // ...
}

如何在 Hibernate 中映射它? The hibernate documentation 声明了三种类型的继承配置:每个类一个表、一个带有类型列的表和一个连接表——这些都不适用。

我需要这样做的原因是因为 A 类来自可在多个项目中重复使用的通用框架,而 B 类(和 Node)是特定于一个项目的扩展——它们不会被再次使用。将来,我可能会有一个带有 house_ID 或其他字段的 C 类。

编辑:如果我尝试上述伪代码配置(两个实体映射到同一个表),我会收到 DTYPE 列不存在的错误。 HQL 附加了一个“where DTYPE="A"。

【问题讨论】:

  • 如果将这些类映射到同一张表,没有discriminator列,Hibernate如何区分哪个是哪个?
  • @axtavt 这就是重点; B 的每个实例也是一个 A。

标签: java hibernate


【解决方案1】:

这可以通过将@DiscriminatorColumn@DiscriminatorValue 映射到两个类的相同值来实现;这可以来自您使用的任何具有相同数据的列,无论哪种类型(不确定它是否适用于空值)。

类应该是这样的:

@Entity
@Table(name="Book")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="published")
@DiscriminatorValue(value="true")
public class A {
    private String ID;
    private String Name;
    // ...
}

@Entity
@Table(name="Book")
@DiscriminatorValue(value="true")
public class B extends A {
    public String node_ID;
    // ...
}

【讨论】:

  • 对我不起作用。我收到org.hibernate.MappingException: Entities [B] and [A] are mapped with the same discriminator value 'true'。 (如果这很重要,休眠版本是 5.3.7)。
猜你喜欢
  • 2013-08-20
  • 2012-01-10
  • 1970-01-01
  • 2014-12-12
  • 2010-12-12
  • 2012-02-03
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多