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

时间:2015-09-18 12:46:12

标签: jpa entitylisteners

实体监听器通常放在各自的实体类上,例如

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

    //...
}

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

如果实体侦听器不与各个实体紧密耦合并且单独指定,则不需要将此依赖项(侦听器)添加到类库,即实体侦听器将仅出现在EE项目中其中EJB完全符合使用@Inject注入的条件。

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

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

使注释@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>

然后可以保持相应的监听器类不带注释,如下所示。

public class EntityListener {

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

        // Do something with the entity.
    }
}

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

如果需要,可以将回调定义为XML元素,避免在侦听器类中使用回调注释,例如,

<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>

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

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