加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – DiscriminatorFormula

发布时间:2020-12-15 08:43:58 所属栏目:Java 来源:网络整理
导读:如果我有一个表,我需要多个列作为鉴别器,我唯一的解决方案是使用@DiscriminatorFormula? 我问,因为一些原型设计给了我们一些我无法解释的结果. 失败的原型:最初我们使用超类上的一个@DiscriminatorColumn原型化一个3深的类层次结构,并在子类上包含第二个@D
如果我有一个表,我需要多个列作为鉴别器,我唯一的解决方案是使用@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”的表.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读