独立于其关联实体单独指定 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] =] 应用程序。
实体侦听器通常放置在各自的实体 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
.
是否有可能将此注解@EntityListeners(EntityListener.class)
与其关联的实体分开,以便在单独的地方单独声明?不需要将此注释与其各自的实体紧密耦合。
使用具有 EclipseLink 2.6.0 (JPA 2.1) 的 GlassFish 4.1。
这是必需的,因为有一个 @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] =] 应用程序。