独立于其关联实体单独指定 JPA 实体侦听器

Specifying JPA entity listeners separately being independent of its associated entity

实体侦听器通常放置在各自的实体 class 上,例如,

@Entity
@EntityListeners(EntityListener.class)
public class Entity implements Serializable {

    //...
}

应用程序可以使用一个或多个 class 库来在不同 projects/modules 之间共享通用功能。除了 EE 模块之外,class 库基本上还要求实体作为依赖存在于编译时 class 路径上,即实体存在于两个地方,即 class库和企业应用程序中的 EE 模块。因此,给定示例中的 class EntityListener 需要出现在 class 库的编译时 class 路径中(它不能只添加到EE 模块)。

如果实体侦听器不与各自的实体紧密耦合并单独指定,则无需将此依赖项(侦听器)添加到 class 库,即实体侦听器将是仅出现在 EJB 完全有资格使用 @Inject.

进行注入的 EE 项目中

是否有可能将此注解@EntityListeners(EntityListener.class)与其关联的实体分开,以便在单独的地方单独声明?不需要将此注释与其各自的实体紧密耦合。

使用具有 EclipseLink 2.6.0 (JPA 2.1) 的 GlassFish 4.1。


这是必需的,因为有一个 将 EJB 注入此类实体侦听器 在 class 库中可用 使用特定于 CDI神器 @Inject。如果侦听器仅存在于 EE 项目(模块)中(但不在 class 库中),则可以通过使用 @Inject 将 EJB 注入侦听器。

是的,您可以用 xml 定义 default entity listener

从实体中移除注释 @EntityListeners 的一种方法是同时使用 XML 和注释方法。混合和匹配 XML 描述符和元数据注释是完全有效且有记录的。

为了覆盖该注释,必须在名为 orm.xml[1] 的文件中注册实体侦听器,如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings version="2.1"
                 xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm orm_2_1.xsd">

    <entity class="com.example.entity.Entity">
        <entity-listeners>
            <entity-listener class="com.example.entity.listeners.EntityListener"/>
        </entity-listeners>
    </entity>

    <!--Other listeners-->

</entity-mappings>

相应的侦听器 class 可以保持不变,注释如下。

public class EntityListener {

    @PostPersist
    @PostUpdate
    @PostRemove
    public void onChange(Entity entity) {

        // Do something with the entity.
    }
}

这些回调可能因功能要求而异。


如有必要,也可以将回调定义为 XML 元素,避免在监听器中使用回调注释 class 例如,

<entity class="com.example.entity.Entity">
    <entity-listeners>
        <entity-listener class="com.example.entity.listeners.EntityListener">
            <post-persist method-name="onChange"/>
            <post-update method-name="onChange"/>
            <post-remove method-name="onChange"/>
        </entity-listener>
    </entity-listeners>
</entity>

侦听器 class 中的 @PostPersist@PostUpdate@PostRemove 这三个注释现在不再需要,因为它们已在 XML 中注册描述符。


[1] 像 NetBeans 这样的 IDE 似乎没有生成 orm.xml 文件的向导支持。在 NetBeans 项目中,需要在 src/conf(或任何其他自定义配置的位置)下手动创建一个 XML 文件,以便应用程序构建器可以将该文件放在 META-INF/orm.xml 下,而 [=43] =] 应用程序。