java – DiscriminatorFormula

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

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

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

discriminator column has to be defined in the root entity,it will be ignored in subclass

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

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

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

解决方法

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

@Entity
@Table(name = "features")
@discriminatorColumn
public class Features{
    //valid code
}

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
}

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
}

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

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

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

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

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...