gpt4 book ai didi

java - 鉴别器公式

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:50:10 27 4
gpt4 key购买 nike

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

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

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

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

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

成功了吗?原型(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
}

在名为“features”的表中,您有“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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com