Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 鉴别器公式_Java_Hibernate_Orm_Persistence_Table Per Hierarchy - Fatal编程技术网

Java 鉴别器公式

Java 鉴别器公式,java,hibernate,orm,persistence,table-per-hierarchy,Java,Hibernate,Orm,Persistence,Table Per Hierarchy,如果我有一个表,其中需要多个列作为鉴别器,那么我唯一的解决方案是使用@DiscriminatorFormula吗 我这样问是因为一些原型给了我们一些我无法解释的结果 原型失败:最初,我们在超类上使用一个@DiscriminatorColumn原型化了一个3层的类层次结构,并在子类上包含了第二个@DiscriminatorColumn。我们当然得到了这样的警告: 必须在根实体中定义鉴别器列,它将在子类中被忽略 我们发现更新有效,但插入无效。所以我们放弃了这个想法 成功了吗?原型: 然后我们尝试了下

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

我这样问是因为一些原型给了我们一些我无法解释的结果

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

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

我们发现更新有效,但插入无效。所以我们放弃了这个想法

成功了吗?原型: 然后我们尝试了下面的方法,这似乎是可行的:省略子类上的第二个@DiscriminatorColumn,只在外键上包含@JoinColumn(无论如何我们都需要它)。也许,由于连接到不同类型的对象,Hibernate/JPA似乎能够确定哪个子类是正确的。有人能解释一下吗


我们是否应该放弃这一点,只使用@DiscriminatorFormula来获得在两个鉴别器列上定义的显式关系?

我将其切换为使用鉴别器公式,它现在工作得很好。

鉴别器公式是鉴别器列的替代品。使用其中一个注释超类(将实际表映射为默认值)。 使用DiscriminatorColumn,它会创建一个额外的列(默认称为“dtype”),其中包含discriminator值。 将注释放在超类中:

@Entity
@Table(name = "features")
@DiscriminatorColumn
public class Features{
    //valid code
}
鉴别器公式允许您检查数据库行内容,并通过鉴别器值“选择”子类。不创建其他(“数据类型”)列。 在主类中,使用公式注释超类,如:

@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,在附加的数据类型列中可以有“NUMERIC”或“TEXT”值,也可以有“num_值”和“txt_值”列

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

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

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

您能否发布一些关于“successful”原型的代码?DiscriminatorColumn根本不起作用。我把它换成了使用鉴别器公式,现在它工作得很好。谢谢,干得好,约翰·达夫。请你自己发布一个问题的答案,然后接受这个答案,这样我们就可以结束这个问题了?此外,如果前面的问题解决了您的问题,您需要接受这些问题的答案。