我问,因为一些原型设计给了我们一些我无法解释的结果.
失败的原型:最初我们使用超类上的一个@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个鉴别器列上定义的显式关系吗?
解决方法
使用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”的表.