Java EE持久性.嵌套的@PostLoad.supercalss中的PostLoad回调方法

30t*_*thh 4 java hibernate jpa java-ee superclass

如果实体类及其超类都实现了带注释的方法,会发生javax.persistence.PostLoad什么?必须调用哪种方法,哪种方法最先?它是否依赖于方法的可见性(私有,公共)?

(Hibernate默认会话根本不调用这些方法,我将使用Hibernate实现一个变通方法PostLoadEventListener.)

Pio*_*cki 6

让我复制Java Persistence 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) { .... }
}
Run Code Online (Sandbox Code Playgroud)

如果在Cat实例上发生PostPersist事件,
则按顺序调用以下方法:- postPersistPetListenerMethod
- postPersistCatListenerMethod
- postPersistCatListener2Method
- postPersistAnimal

希望有所帮助!