我正在使用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 {
}
当我选择所有“Line”时,生成的查询是
select code, value from parameter where type = ?
type ='fr.itce.babel.entity.Line'
它对我有用。
但是当删除一个Line实体时,我会得到类似的东西
delete from parameter where code = ?
Yuck ...它不使用discriminator列,因此如果它是一个Phase,则删除具有相同代码事件的所有实体...
如何在删除查询中强制使用discriminator列?
答案 0 :(得分:1)
代码是Id,并且是唯一的,所以应该没有问题吗?
您可以使用DescriptorCustomizer在DescriptorQueryManager上使用自定义deleteQuery强制包含该类型,但由于代码是Id,我无法看到我的原因。如果您担心用户删除不正确的对象,您可能还希望使用乐观锁定(@Version)。
答案 1 :(得分:0)
这些实体位于一个表中,其中键列为代码。因为它是一个密钥,所以它是唯一的,并且不可能有多个具有相同代码值的实体。 EclipseLink知道实体的类型,因此不需要在delete语句中使用discriminator。