当前位置: 首页 > 知识库问答 >
问题:

Hibernate中不带鉴别器列的逐层次表策略

薄烨
2023-03-14

我们有一个遗留表,我们不想在其中添加鉴别器列。没有鉴别器列,是否有可能有每个层次结构的表?

我的父类代码:

@Entity
@Table(name = "SHAPE1")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "Discriminator",
                     discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue(value = "S")

public class Shape {

    @Id
    @Column(name = "Shape_Id")
    int shapeId;

    @Column(name = "Shape_Name")
    String shapeName;

    public Shape() {

    }

    public Shape(int id, String shapeName) {
        this.shapeId = id;
        this.shapeName = shapeName;
    }

    // getters and setters
}

我的孩子班:

@Entity
@DiscriminatorValue(value = "R")
public class Rectangle extends Shape {

    @Column(name = "Rectangle_Length")
    int length;

    @Column(name = "Rectangle_Breadth")
    int breadth;

    public Rectangle() {
    }

    public Rectangle(int id, String shapeName, int length, int breadth) {
        super(id, shapeName);
        this.length = length;
        this.breadth = breadth;
    }

    // getters and setters
}

你可以在我上面的例子中看到,我必须使用鉴别器。

共有1个答案

吴均
2023-03-14

SINGLE_TABLE是一种非常强大的策略,但有时,尤其是对于遗留系统,您无法添加额外的鉴别器列。为此,Hibernate引入了鉴别器公式的概念:@DiscriminatorFormula@DiscriminatorColumn的替代品,并使用SQL片段作为鉴别器解析的公式(无需专用列)。

@Entity
@DiscriminatorFormula("case when forest_type is null then 0 else forest_type end")
public class Forest { ... }
 类似资料:
  • 我有一个基于hibernate策略的实体层次结构,并且我在application.yml中设置了。 当我使用h2db运行测试时,我得到“null not allowed for column”。 当指令创建形状表时,它将鉴别器列设置为,因此得到“null not allowed for column”。 是否有一种方法可以使用DDL-AUTO强制区分器列为null?

  • 我们有一个遗留表,我们不希望通过添加鉴别器列来改变它。有没有可能有不带鉴别器列的tablePerHierarchy。 下面是我的父级和子级代码 @Table(名称=“Shape1”)@Inheritation(策略=InheritanceType.Single_Table)@DiscriminatorColumn(名称=“Discriminator”,discriminatorType=discr

  • 我的SINGLE_TAB继承Hibernate配置中出现了一个奇怪的情况,@DiscriminatorColumn似乎被忽略了,而查询总是默认返回到'dtype'列。这就像我在完全没有包含注释(默认列名为'dType')时看到的行为一样。 基本实体: 子类实体: 我还需要访问每个对象中的鉴别器值本身(postType字段)。我仍然有相同的行为,即使我移除它,所以它似乎不是原因。 当我试图通过JPA

  • 问题内容: 是否可以强制休眠将歧视符列用于继承的继承类型?根据JPA2.0规范,这应该可行,但是我无法在休眠状态下实现。 例: 使用hibernate.hbm2ddl.auto create时,这甚至都不会在表PARENT中创建列TYPE。 我知道InheritanceType.JOINED可以在不定义鉴别符列的情况下工作,但是它是非常无效的,因为在使用鉴别符列中的信息时,休眠需要在父对象和所有子

  • 我有一个具体的JPA实体超类,它使用鉴别器列与映射,还有两个子类实体,它们用其他属性扩展了这个超类。 在某些情况下,我希望指定额外的鉴别器值,而不必为每个类型显式定义子类(也就是说,并不是每个“baseEntity”都指定支持子类/单独表的额外属性)。这种策略在数据库设计和Java类层次结构中都很有效,但是,Hibernate JPA不允许这样做,并抛出,因为没有映射到鉴别器的子类: 在本例中,我

  • 我有一个与鉴别器列连接的继承映射。 父实体: 附注。我使用的是hibernate 5.0.9.Final。