在JPA 2中,可以使用像
@PrePersist
这样的注释来声明多少个方法以及这些方法的执行顺序?有时我们也会为监听器创建不同的类,并使用 @EntityListener
注解将该类应用到实体上,并且我们也在实体中声明方法,那么这些方法的执行顺序是什么?
关于调用顺序,JPA 2 规范第 3.5 节指出:
如果有多个实体监听器 已定义,调用它们的顺序由指定它们的顺序决定 在 EntityListeners 注释中。 XML 描述符可以用作 指定实体侦听器的调用顺序或覆盖元数据注释中指定的顺序。
关于是否对同一生命周期事件使用多种方法,JPA 2 规范在第 3.5 节中指出:
对于同一生命周期事件,单个类不得有多个生命周期回调方法。相同的方法可以用于多个回调事件。
可以在以下位置声明
@PrePersist
带注释的方法:
@EntityListener
注解引用的侦听器上。该顺序在 JPA 2.2 规范的 3.5.5 部分中定义(JPA 2.0 规范中的 3.5.4),总结如下:
@EntityListeners
按照它们出现在实体类注释上的顺序定义。如果存在实体层次结构,则超类中引用的侦听器将在子类中引用的侦听器之前执行。这里是 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 类型(允许跨多个监听器共享 实体。)