Inheritance 强制EclipseLink在delete语句中使用鉴别器列

Inheritance 强制EclipseLink在delete语句中使用鉴别器列,inheritance,eclipselink,jpa-2.0,Inheritance,Eclipselink,Jpa 2.0,我正在使用JPA/EclipseLink。我定义了一个名为Parameter的超类 @Entity @Table(name="parameter") @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING,length=64) @DiscriminatorValue(value="fr.itce.b

我正在使用JPA/EclipseLink。我定义了一个名为Parameter的超类

@Entity
@Table(name="parameter")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING,length=64)
@DiscriminatorValue(value="fr.itce.babel.entity.Parameter")
public class Parameter {
    @Id
    String code;

    String value;
...
}
和其他两个继承的实体

@Entity
@DiscriminatorValue(value="fr.itce.babel.entity.Line")
public class Line extends Parameter {

}

@Entity
@DiscriminatorValue(value="fr.itce.babel.entity.Phase")
public class Phase extends Parameter {

}
当我选择all“Line”时,生成的查询是

select code, value from parameter where type = ?
类型为'fr.itce.babel.entity.Line'

它对我有用

但是当删除一个线实体时,我会得到这样的结果

delete from parameter where code = ?
哎呀。。。它不使用鉴别器列,因此如果是阶段,则删除具有相同代码事件的所有实体


如何在删除查询中强制使用鉴别器列?

这些实体位于一个表中,其中键列是代码。因为它是一个键,所以它是唯一的,并且不可能有多个具有相同代码值的实体。EclipseLink知道实体的类型,所以在delete语句中不需要有鉴别器

代码是Id,并且是唯一的,所以不应该有问题吗

您可以使用DescriptorQueryManager上的自定义deleteQuery,使用DescriptorUserMizer,强制包含该类型,但我看不出这样做的原因,因为代码是Id。如果您担心用户删除不正确的对象,您可能还希望使用乐观锁定(@Version)