2011-11-16 34 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

希望帮助!