Java 鉴别器公式
如果我有一个表,其中需要多个列作为鉴别器,那么我唯一的解决方案是使用@DiscriminatorFormula吗 我这样问是因为一些原型给了我们一些我无法解释的结果 原型失败:最初,我们在超类上使用一个@DiscriminatorColumn原型化了一个3层的类层次结构,并在子类上包含了第二个@DiscriminatorColumn。我们当然得到了这样的警告: 必须在根实体中定义鉴别器列,它将在子类中被忽略 我们发现更新有效,但插入无效。所以我们放弃了这个想法 成功了吗?原型: 然后我们尝试了下面的方法,这似乎是可行的:省略子类上的第二个@DiscriminatorColumn,只在外键上包含@JoinColumn(无论如何我们都需要它)。也许,由于连接到不同类型的对象,Hibernate/JPA似乎能够确定哪个子类是正确的。有人能解释一下吗Java 鉴别器公式,java,hibernate,orm,persistence,table-per-hierarchy,Java,Hibernate,Orm,Persistence,Table Per Hierarchy,如果我有一个表,其中需要多个列作为鉴别器,那么我唯一的解决方案是使用@DiscriminatorFormula吗 我这样问是因为一些原型给了我们一些我无法解释的结果 原型失败:最初,我们在超类上使用一个@DiscriminatorColumn原型化了一个3层的类层次结构,并在子类上包含了第二个@DiscriminatorColumn。我们当然得到了这样的警告: 必须在根实体中定义鉴别器列,它将在子类中被忽略 我们发现更新有效,但插入无效。所以我们放弃了这个想法 成功了吗?原型: 然后我们尝试了下
我们是否应该放弃这一点,只使用@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根本不起作用。我把它换成了使用鉴别器公式,现在它工作得很好。谢谢,干得好,约翰·达夫。请你自己发布一个问题的答案,然后接受这个答案,这样我们就可以结束这个问题了?此外,如果前面的问题解决了您的问题,您需要接受这些问题的答案。