如果实体类及其超类都实现了用javax.persistence.PostLoad
注释的方法,会发生什么?必须调用哪种方法,哪种方法最先?它是否依赖于方法的可见性(私有,公共)?
(Hibernate默认会话根本不调用这样的方法,我即将使用Hibernate PostLoadEventListener
实现一种解决方法。)
答案 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
希望有所帮助!