2012-01-11 34 views
0

我正在使用JPA/EclipseLink。我定義了一個名爲超參數強制EclipseLink在刪除語句中使用鑑別器列

@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 { 

} 

當我選擇所有「行」,生成的查詢是

select code, value from parameter where type = ? 

類型=' 'fr.itce.babel.entity.Line'

它適合我。

但刪除線實體的時候,我得到這樣的事情

delete from parameter where code = ? 

呸......它不使用鑑別​​柱等刪除所有實體相同的代碼事件,如果它是一個階段...

如何在我的刪除查詢中強制使用鑑別器列?

回答

0

這些實體在一個表中,其中鍵列是代碼。因爲它是關鍵,所以它是唯一的,並且不可能有多個具有相同值的實體代碼。 EclipseLink知道實體的類型,因此不需要在刪除語句中使用鑑別器。

1

代碼是Id和唯一的,所以不應該有問題?

您可以使用DescriptorCustomizer在DescriptorQueryManager上強制使用自定義的deleteQuery來包含該類型,但我無法看到我的理由,因爲代碼是Id。如果您擔心用戶刪除不正確的對象,則可能還希望使用樂觀鎖定(@Version)。