Java EE持久性。嵌套的@PostLoad。超类中的PostLoad回调方法

时间:2011-11-16 10:41:48

标签: java hibernate java-ee jpa superclass

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

(Hibernate默认会话根本不调用这样的方法,我即将使用Hibernate PostLoadEventListener实现一种解决方法。)

1 个答案:

答案 0 :(得分:6)

让我复制Java Persistence API 2.0 FR规范的一些部分,我认为这些部分可能会回答您的问题。

3.5.1生命周期回调方法

  

回调方法可以包含 public,private,protected或package   等级访问,但不得为静态或最终。

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

希望有所帮助!