当前位置: 首页 > 面试题库 >

在没有DTYPE列的情况下将多个类映射到Hibernate中的表

吕亮
2023-03-14
问题内容

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

例如,我有:

@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中对此进行映射?hibernate文档说明了三种类型的继承配置:每个类一个表,一个具有类型列的表和一个联接表-在此都不适用。

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

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


问题答案:

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

这些类应如下所示:

@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;
    // ...
}


 类似资料:
  • TL;DR:将@webservlet(“/find-customers”)放在servlet(通过Tomcat 7部署)的开头并不是将servlet映射到host:port/webproject/find-customers中,即使servlet位于src文件夹中。

  • 是否可以使用Hiberanate映射数据库列,这样我就可以在HQL查询中使用它,但不能将它映射到映射类中的实际属性? 由于数据库强加给我们的表名和列名类似于hashcodes,我们希望使用HQL进行更新,它可以使用漂亮的映射名称。因此,我们需要在Hibernate中映射列。

  • 我的项目有问题。我试图创建一个搜索功能,从用户表中搜索用户,但与此同时,我还想从另一个化身表中检索用户化身的相应“url”。我确实想在这两个表之间创建一个硬映射。我怎样才能灵活地使用Hibernate标准呢?两个表都使用“loginID”主键。 我有两个班: 我写的是: 谢谢大家!!

  • 问题内容: 在我的applicationContext.xml中,这就是将xml映射到POJO的方式。如何将目录映射到类文件而无需创建xml? 问题答案: 您可以通过转换进一步简化操作 至 现在您的包中所有带有注释的类都将自动被拾取。

  • 问题内容: 我需要将两个表映射到一个类,但很难弄清楚。一个表是ROOMS,另一个表是TRAINERS。 ROOMS表: 培训人员表: 表应当加入了,和。 ROOMS表的主键是:。TRAINERS表的主键是:。 我需要通过查询这个数据,,,,和。 在SQL中,可能类似于: 我正在项目中其他地方使用ROOMS表,它已经映射为独立对象。是否有一种方法可以将其用作TRAINERS对象的子对象,或者将这两个

  • 我正在使用实体框架映射一些表,但除非我声明一些列作为主键,否则我无法这样做。 这里的问题是,数据库中的表没有主键,并且有数百万行。我没有创建新Id列的权限。 Obs:如果我将属性添加到诸如