强制EclipseLink在delete语句中使用discriminator列

时间:2012-01-11 11:18:20

标签: 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.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列?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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