2012-08-27 72 views
0

我有一個實體,其中包含幾個基本字段A,B和C以及一個複雜字段X,它不是(不應該)映射到數據庫列。這個想法是在加載實例時從A,B和C創建X,並在持久時將X解構成A,B和C.JPA帶回調方法的瞬態字段

第一個順理成章的事情嘗試是這樣的:

 @Entity 
     class Xxx 
     { 

     private String a; 

     @Transient 
     private X x; 

     @PrePersist 
     public void prePersist() 
     { 
     XParts xp = x.deconstruct(); 
     a = xp.getA(); 
     //... 
     } 
     //... 
     } 

的問題是,調用entityManager.merge時(XXX); x丟失。與JPA中如何處理@Transient有關。 @Transient和@PrePersist不會混用。好。不能與我想的規格爭論。

但是,有什麼替代方案?我真的不需要數據庫中的X.

我能想出的最好的是:

@Column(insertable=false,updatable=false) 
    private X x; 

它創建列X,這始終是零。如果它真的是唯一的方法,我可以忍受這一點,但它似乎充其量只是黑客。

我不能是唯一遇到這個問題的人。有沒有更好的方法來做到這一點?

+0

當您調用合併時,@PreUpdate註釋將是調用的權利。 – JMelnik

回答

1

JPA不提供任何PostMerge事件,但是如果您使用的是EclipseLink,則可以定義一個DescriptorEventListener,它可以訪問postMerge,從而可以合併您的瞬態屬性。

+1

我只使用JPA與hibernate並移動到EclipseLink爲時已晚。任何其他建議? – Cyclope

0

我認爲你有相同的「prePersist」方法,但用@PreUpdate註釋可能會解決你的問題。你嘗試過嗎?