EJB3.0笔记-1 Entity回调和监听器

在你执行EntityManager的persist()、merge、remove和find方法时,或者在执行EJB QL查询时,一系列预先定义好的生命周期事件会被触发。Java Persistence规范允许在entity class上设置回调方法,当这些事件发生时,该entity会收到相应的通知。也可以注册一些单独的监听类来拦截这些事件

回调事件
它们代表了entity生命周期中的一个阶段(pre表示之前,post表示之后)
@javax.persistence.PrePersist; @javax.persistence.PostPersist;
@javax.persistence.PreUpdate; @javax.persistence.PostUpdate;
@javax.persistence.PreRemove; @javax.persistence.PostRemove; @javax.persistence.PostLoad(在查询数据或refresh()时会触发)

Entity Class上的回调方法
通过为entity bean 的任何一个public、private、protected或package-protected方法添加注解,当某个接受托管的entity实例触发事件时,entity manager会调用entity bean上被添加了注解的相应方法。回调方法必须返回void,不抛出checked exception,并无传入参数。如:
@PostPersist void afterInsert(){………}
    等价的ORM映射文件
    <entity class=”com.titan.domain.Cabin”>
        <post-persist name=” afterInsert”/>
    </entity>

Entity 监听器
Entity监听器是一种能够拦截entity回调事件的类。它本身不是entity class,它必须有一个公有无参构造函数,监听方法必须返回void,并接受一个Object类型的参数,它就是触发事件的entity实例
    public class TitanAuditLogger{
        @PostPersist void postInsert(Object entity){……..}
    }
    通过@javax.persistence.EntityListeners注解把监听器应用于某个entity class
    @Entity
    @EntityListeners{ TitanAuditLogger.class,其它监听器}
    public class Cabin{….}
    等价XML
    <entity class=”com.titan.domain.Cabin”>
        <entity-listeners>
            <entity-listener class=”com.titan.listeners.TitanAuditLogger”>
                <post-resist name=” postInsert”/>
            </ entity-listener >
        </entity-listeners >
    </entity>
Entity监听器的执行顺序是它们在@EntityListeners注解或ORM XML映射文件中的声明顺序,而任何在entity class上声明的回调方法则会在其后被调用

默认的Entity监听器
可以在ORM映射文件中,通过顶层元素<entity-mappings>下的<entity-listeners>元素,为persistence unit中的每一个entitty class指定一组默认的entity监听器,如:
<entity-mappings>
    <entity-listeners>
            <entity-listeners>
                <entity-listener class=”com.titan.listeners.TitanAuditLogger”>
                    <post-resist name=” postInsert”/>
                </ entity-listener >
            </entity-listeners >
    </entity-listeners>
</entity-mappings>
如果想关闭默认的entity监听器,可以使用@javax.persistence.ExcludeDefaultListeners注解
    @Entity
    @ExcludeDefaultListeners
    public class Cabin{….}
    等价的XML
    <entity class=”com.titan.domain.Cabin”>
        <exclude-default-listeners/>
    </entity>

继承与监听器的关系
如果在一个实体的继承层次中,entity监听器被用于基类,则所有子类都会继承基类的监听器。基类的监听器会先于子类的监听器执行,如果想关闭从父类继承下来的entity监听器,可以使用@javax.persistence.ExcludeSupperclassListeners,如:
@Entity
@ExcludeSupperclassListeners
public class Customer extends Person{……}

你可能感兴趣的:(xml,bean,orm,ejb)