2012-10-15 63 views
1

使用Eclipselink 2.2.0映射繼承時出現問題。 這裏是我的抽象的實體:JPA Eclipselink繼承:更新不起作用

@Entity 
@Inheritance(strategy= InheritanceType.SINGLE_TABLE) 
public abstract class Feature extends TenantPossession { 

    private FeatureType featureType; 

    @Enumerated(EnumType.STRING) 
    public FeatureType getFeatureType() { 
     return featureType; 
    } 

    public void setFeatureType(FeatureType featureType) { 
     this.featureType = featureType; 
    } 
} 

子類看起來是這樣的:

@Entity 
public class RecordingFeature extends Feature { 
    // here some attributes 
} 

當我保存的功能,第一次它工作正常。但是,當我嘗試設置功能類型並保存時,沒有任何反應。

Feature feature = new RecordingFeature(); 
feature.setType(FeatureType.RECORDING); 
feature = featureService.save(feature); // works fine 

...提交事務,並開始另一個事務...

feature.setType(FeatureType.UNKNOWN); 
feature = featureService.save(feature); // seems to work, but type is not set in DB 

是否有事可做與繼承?我沒有繼承的代碼中的另一個案件工作正常。

+0

不確定它是否有幫助,但在您的抽象類中嘗試@MappedSuperclass而不是'@Entity。 –

+0

我已經想過,但在這種情況下,我需要每個子類的一個服務,並且搜索所有功能是不可能的。 =/ – santedicola

+0

爲什麼你再次調用'save(feature)'方法?例如,如果您想更改'FeatureType',只需調用'update(feature)'方法即可。請提交'FeatureService'和'Entity'完整代碼。 – CycDemo

回答

2

save()做了什麼?確保您正在更改對象的管理版本,而不是分離的對象。

你有編織啓用?如果禁用編織(更改跟蹤),會發生什麼情況?

+0

save()只是調用entityManager.merge(特性)。我剛剛注意到的一些事情:如果我設置了子類的任何屬性,它就會起作用。這看起來真的很像抽象類的問題。 PS:我不能設置eclipselink配置。 =( – santedicola

+1

)您是否使用編織?嘗試在您的類中添加@ChangeTracking(DEFERRED)。可能是因爲您沒有編織超類,而只編寫子類。確保超類包含在類列表中。 – James

+0

是的,我使用編織,但我不知道這個註釋,只有persistence.xml中的屬性「eclipselink.weaving.changetracking」,我不允許改變。謝謝你的建議,我會嘗試。 – santedicola