实体监听器通常放在各自的实体类上,例如
@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。
子>
答案 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
下。 /子>