【问题标题】:Java EE persistence. Nested @PostLoad. PostLoad callback method in supercalssJava EE 持久性。嵌套@PostLoad。超类中的 PostLoad 回调方法
【发布时间】:2011-12-30 07:44:10
【问题描述】:
如果实体类和它的超类都实现了带有javax.persistence.PostLoad注解的方法,会发生什么?必须调用哪个方法,首先调用哪个方法?它是否依赖于方法的可见性(私有、公共)?
(Hibernate 默认会话根本不调用此类方法,我将使用 Hibernate PostLoadEventListener 实现一个解决方法。)
【问题讨论】:
标签:
java
hibernate
jakarta-ee
jpa
superclass
【解决方案1】:
让我复制 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
希望有帮助!