2011-11-16 43 views
4

如果實體類及其超類實現了使用javax.persistence.PostLoad註釋的方法,會發生什麼?哪個方法必須被調用,哪個方法是第一個?它依賴於方法的可見性(私人,公共)嗎?Java EE持久性。嵌套@PostLoad。 supercalss中的PostLoad回調方法

(Hibernate的默認會話時都沒有調用這些方法和我即將實現使用Hibernate的PostLoadEventListener一種變通方法。)

回答

6

讓我複製了Java持久性API 2.0 FR規範,我相信一些地區可能會回答你的問題。

3.5.1生命週期回調方法

回調方法可以有公共,私有,保護,或包裝 級訪問,但絕不能是靜態或決賽。

3.5.4多個生命週期回調方法實體的生命週期事件

如果多個類在繼承 層次實體類和/或映射超界定實體 聽衆,的在 之前調用爲超類定義的偵聽器,其偵聽器按照的順序爲其子類定義。

(...)

如果用於相同的生命週期事件的生命週期回調方法還對實體類和/或一種或多種其實體或 映射超,對回調方法指定 實體類和/或 超類被調用其他生命週期回調方法, 最普遍的超類第一。

而下面的部分帶來這可能會解決你的問題很具體的例子:

3.5.5例

有幾個實體類和監聽動物:

@Entity 
public class Animal { 
    .... 
    @PostPersist 
    protected void postPersistAnimal() { .... } 
} 

@Entity 
@EntityListeners(PetListener.class) 
public class Pet extends Animal { 
    .... 
} 

@Entity 
@EntityListeners({CatListener.class, CatListener2.class}) 
public class Cat extends Pet { 
    .... 
} 

public class PetListener { 
    @PostPersist 
    protected void postPersistPetListenerMethod(Object pet) { .... } 
} 

public class CatListener { 
    @PostPersist 
    protected void postPersistCatListenerMethod(Object cat) { .... } 
} 

public class CatListener2 { 
    @PostPersist 
    protected void postPersistCatListener2Method(Object cat) { .... } 
} 

如果在Cat的一個實例上發生PostPersist事件,則以下 個方法調用順序:
- postPersistPetListenerMethod
- postPersistCatListenerMethod
- postPersistCatListener2Method
- postPersistAnimal

希望幫助!