【问题标题】: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

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-22
      • 2012-09-26
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多