DiscriminatorFormula

Joh*_*uff 3 java orm persistence hibernate table-per-hierarchy

如果我有一个表,我需要多个列作为鉴别器,我唯一的解决方案是使用@DiscriminatorFormula?

我问,因为一些原型设计给了我们一些我无法解释的结果.

失败的原型:最初我们使用超类上的一个@DiscriminatorColumn原型化一个3深的类层次结构,并在子类上包含第二个@DiscriminatorColumn.当然我们得到了这个警告:

Discriminator列必须在根实体中定义,它将在子类中被忽略

我们发现更新有效,但插入没有.所以我们废弃了这个想法.

成功的?原型: 然后我们尝试了以下似乎有效:在子类上省略第二个@DiscriminatorColumn,只在外键上包含@JoinColumn(无论如何我们都需要它).也许,由于连接是针对不同类型的对象,Hibernate/JPA似乎能够找出哪个子类是正确的.有谁能解释一下?

我们应该废弃它并只使用@DiscriminatorFormula来获得在2个鉴别器列上定义的显式关系吗?

Lau*_*ulo 9

DiscriminatorFormula是DiscriminatorColumn的替代品.您使用其中一个批注超类(将实际表映射为默认值).使用DiscriminatorColumn,它会创建一个包含鉴别器值的附加列(默认称为"dtype").您将注释放在超类中:

@Entity
@Table(name = "features")
@DiscriminatorColumn
public class Features{
    //valid code
}
Run Code Online (Sandbox Code Playgroud)

DiscriminatorFormula允许您检查数据库行内容并通过鉴别器值"选择"子类.没有创建其他("dtype")列.在主类中,您使用公式注释超类,如:

@Entity
@Table(name = "features")
@DiscriminatorFormula(
        "CASE WHEN num_value IS NOT NULL THEN 'NUMERIC' " +
        " WHEN txt_value IS NOT NULL THEN 'TEXT' end"
)
public class Features{
    //valid code
}
Run Code Online (Sandbox Code Playgroud)

在DiscriminatorFormula中,你只需要一些纯SQL来做你需要的.

您可以选择这两个选项中的一个,并且子类在两种情况下都完全相同.在子类中,您可以为示例指定鉴别器值:

@Entity
@DiscriminatorValue('NUMERIC')
public class NumericFeatures extends Features {

    private Double numValue;

    public Double getNumValue() {
        return numValue;
    }

    public void setNumValue(Double numValue) {
        this.numValue = numValue;
    }

    //valid code
}
Run Code Online (Sandbox Code Playgroud)

在名为"features"的表中,您有两列"num_value"和"txt_value",其中包含相应的值.使用DiscriminatorColumn,您可以在附加dtype列中使用"NUMERIC"或"TEXT"值,也可以使用"num_value"和"txt_value"列.

如果未指定继承策略,则默认为"SINGLE_TYPE".如果是您选择的策略,则可以省略以下注释:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
Run Code Online (Sandbox Code Playgroud)

无论是否有此注释,您都会得到一个名为"Features"的表.