Постоянство Java EE.Вложенный @PostLoad.Метод обратного вызова PostLoad в суперкассе - PullRequest
4 голосов
/ 16 ноября 2011

Что должно произойти, если и класс сущности, и его суперкласс реализуют методы, помеченные javax.persistence.PostLoad? Какой метод должен быть вызван, а какой первым? Зависит ли это от видимости метода (частного, публичного)?

(Сеанс Hibernate по умолчанию вообще не вызывает такие методы, и я собираюсь реализовать обходной путь, используя Hibernate PostLoadEventListener.)

1 Ответ

6 голосов
/ 16 ноября 2011

Позвольте мне скопировать некоторые части спецификации FR API Java Persistence, которые, как я полагаю, могут ответить на ваш вопрос.

3.5.1 Методы обратного вызова жизненного цикла

Методы обратного вызова могут иметь открытый, частный, защищенный доступ или доступ на уровне пакета , но не должны быть статическими или окончательными.

3.5.4 Несколько методов обратного вызова жизненного цикладля события жизненного цикла объекта

Если несколько классов в иерархии наследования - классы сущности и / или сопоставленные суперклассы - определяют прослушиватели сущности, прослушиватели, определенные для суперкласса, вызываются допрослушиватели, определенные для его подклассов в следующем порядке .

(...)

Если метод обратного вызова жизненного цикла для того же события жизненного цикла также указан в классе сущности и / или одномили более его сущности или сопоставленных суперклассов, методы обратного вызова в классе сущности и / или суперклассах вызываются после другого обратного вызова жизненного цикла methods, сначала самый общий суперкласс.

И в следующем разделе приведен очень подробный пример, который может решить вашу проблему:

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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...