JPA 2:带有 @Prepersist 注释的一个实体中允许有多少个方法?

问题描述 投票:0回答:3

在JPA 2中,可以使用像

@PrePersist
这样的注释来声明多少个方法以及这些方法的执行顺序?有时我们也会为监听器创建不同的类,并使用
@EntityListener
注解将该类应用到实体上,并且我们也在实体中声明方法,那么这些方法的执行顺序是什么?

java hibernate jpa orm annotations
3个回答
6
投票

关于调用顺序,JPA 2 规范第 3.5 节指出:

如果有多个实体监听器 已定义,调用它们的顺序由指定它们的顺序决定 在 EntityListeners 注释中。 XML 描述符可以用作 指定实体侦听器的调用顺序或覆盖元数据注释中指定的顺序。

关于是否对同一生命周期事件使用多种方法,JPA 2 规范在第 3.5 节中指出:

对于同一生命周期事件,单个类不得有多个生命周期回调方法。相同的方法可以用于多个回调事件。


1
投票

可以在以下位置声明

@PrePersist
带注释的方法:

  • 实体类或其任何实体或映射的超类
  • 在 XML 描述符上全局声明的默认侦听器
  • 在实体类及其任何实体或映射超类中使用
    @EntityListener
    注解引用的侦听器上。

该顺序在 JPA 2.2 规范的 3.5.5 部分中定义(JPA 2.0 规范中的 3.5.4),总结如下:

  1. 按照 XML 描述符中定义的顺序排列全局侦听器
  2. @EntityListeners
    按照它们出现在实体类注释上的顺序定义。如果存在实体层次结构,则超类中引用的侦听器将在子类中引用的侦听器之前执行。
  3. 实体类上的生命周期方法。如果存在实体层次结构,则在超类上声明的生命周期方法将在子类上声明的方法之前执行。

0
投票

这里是 Hibernate 文档中为那些使用 Hibernate 的 JPA 规范实现的人提供的“Hibernate 风味”答案 - 第 6.2 章回调和侦听器继承

调用顺序

When an event is raised, the listeners are executed in this order:

- @EntityListeners for a given entity or superclass in the array order

- Entity listeners for the superclasses (highest first)

- Entity Listeners for the entity

- Callbacks of the superclasses (highest first)

- Callbacks of the entity

多种方法

可以注释相同的回调方法或实体监听方法 具有多个回调注释。 对于给定的实体,您不能 有两个方法被相同的回调注释注释 无论是回调方法还是实体监听方法。 A 回调方法是一个无参数方法,没有返回类型和任何 任意名称。实体侦听器的签名无效 (Object) 其中 Object 是实际的实体类型(请注意 Hibernate 实体管理器放宽了这个约束并允许对象 java.lang.Object 类型(允许跨多个监听器共享 实体。)

© www.soinside.com 2019 - 2024. All rights reserved.