将多个类Map到Hibernate中的表(不使用DTYPE列)

xytpbqjk  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(148)

我有两个 hibernate 类:一个基类和一个具有附加字段的扩展类。(这些字段由其他表Map。)
例如,我有:

@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中Map这一点?Hibernate文档说明了三种类型的继承配置:每个类一个表,一个带有类型列表,以及一个连接表--这些都不适用于这里。
我需要这样做的原因是因为类A来自通用框架,可以在多个项目中重用,而类B(和Node)是特定于一个项目的扩展--它们不会再被使用。将来,我可能会有一个带有house_ID或其他字段的类C。

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

cqoc49vn

cqoc49vn1#

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

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

ivqmmu1c2#

对于像我这样的人,如果不想使用dtype列,而是想对多个实体使用同一个表,我建议使用this
基本上,您可以创建这样的Base

@MappedSuperclass
public abstract class BaseBook<T extends BaseBook> {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    ... any other variables, getters + setters
}

@Entity
@Table(name= "book")
public class BookA extends BaseBook<BookA>{ 
  //Default class no need to specify any variables or getters/setters
}

@Entity
@Table(name= "book")
public class BookB extends BaseBook<BookB>{ 
  @Column(name = "other_field")
  private String otherFieldInTableButNotMapedInBase

  ... Any other fields, getter/setter
}

从上面我们已经创建了没有任何实体或表Map的基本超类。然后我们创建BookA作为实体+表Map的默认值。从那里我们可以创建其他实体,所有这些实体都从BaseBook扩展,但指向一个表

相关问题