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

我问是因为一些原型(prototype)设计给了我们一些我无法解释的结果。

失败的原型(prototype): 最初我们在父类(super class)上使用一个@DiscriminatorColumn 并在子类上包含第二个@DiscriminatorColumn 来原型(prototype)化一个3 深的类层次结构。当然,我们收到了这个警告:



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

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

我们是否应该放弃它并仅使用 @DiscriminatorFormula 来获得 明确的 关系定义在 2 个鉴别器列上?

最佳答案

DiscriminatorFormula 是 DiscriminatorColumn 的替代品。您可以使用其中之一注释父类(super class)(默认映射真实表)。
使用 DiscriminatorColumn 它创建一个包含鉴别器值的附加列(默认称为“dtype”)。
您将注释放在父类(super class)中:

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

DiscriminatorFormula 允许您检查数据库行内容并通过鉴别器值“选择”一个子类。没有创建额外的(“dtype”)列。
在主类中,您使用公式注释父类(super class),例如:
@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
}

在名为“功能”的表中,您有两列“num_value”和“txt_value”,包含相应的值。
使用 DiscriminatorColumn,您将在附加 dtype 列以及“num_value”和“txt_value”列中拥有“NUMERIC”或“TEXT”值。

如果您不指定继承策略,则默认为“SINGLE_TYPE”。如果这是您选择的策略,则可以省略以下注释:
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

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

关于java - 判别公式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7604695/

10-10 02:52